forked from Minki/linux
09bd7c75e5
One of the most remarkable improvements in this cycle is, Kbuild is now able to cache the result of shell commands. Some variables are expensive to compute, for example, $(call cc-option,...) invokes the compiler. It is not efficient to redo this computation every time, even when we are not actually building anything. Kbuild creates a hidden file ".cache.mk" that contains invoked shell commands and their results. The speed-up should be noticeable. Summary: - Fix arch build issues (hexagon, sh) - Clean up various Makefiles and scripts - Fix wrong usage of {CFLAGS,LDFLAGS}_MODULE in arch Makefiles - Cache variables that are expensive to compute - Improve cc-ldopton and ld-option for Clang - Optimize output directory creation -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJaDxaLAAoJED2LAQed4NsGIHQP/isMxxaIxIAWU56+ZcII74k7 639VgrKi9n5y25d1dBRTQg+vReHE6E2JbkCqpVOu11t7m0LT7yUK8v3WwyLf1qTN GxnqZ/WMQU5/AYVqIWo8jN4FGHpivHJ6qbeiNJM9qN4RAkzG0sZUq746VaFZYmIR Lu0Gf4m4qjifkkhXsQdWT5i7yNTidPqaL6GNb+FcFkEHlVre8jma0kJlgfHxru84 WmETpjQXvHAZ/R61vY6ekAWpqFhw3ecJY96A9npnx+SQVQdSNAdpaU0SK29jB0ON /SAfpHg9oa/gD0LFOKV6zkjnAkd4TEjrJEiHHhz5gjT/SbS3T1llBIGZ1oV4X7Y0 Vlh9KWlm1FJJI4SIzc9qUaQMp6JtLfEfHKJCc45xVaN3fNrDnR8jl80x5+95ELga dCkZgnq5u82MtTysCbHBESwDYQaVPyIrh7In+mduglaCqhqj9KoDjoLoiGfCg7SA 3tPflYVd629w5l5GrazJ40jWn1+ggMtgMOVooJNJ+dINCP+GxsUpH84Ww2Pdic+/ qLdud6TeqxrZDGzWXqKNLu8alM8NGgSr101l9gIf1oqSyy63duBpMrxGDoIJS3FU rFDoFFUhlfkAXNbQHtVGNzKtcpCjURh992j9Fa1+NfMwSce5IHkMwTvPmNSRowi8 0llLjXhD/bxK6FpdvlV8 =zIdO -----END PGP SIGNATURE----- Merge tag 'kbuild-v4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild Pull Kbuild updates from Masahiro Yamada: "One of the most remarkable improvements in this cycle is, Kbuild is now able to cache the result of shell commands. Some variables are expensive to compute, for example, $(call cc-option,...) invokes the compiler. It is not efficient to redo this computation every time, even when we are not actually building anything. Kbuild creates a hidden file ".cache.mk" that contains invoked shell commands and their results. The speed-up should be noticeable. Summary: - Fix arch build issues (hexagon, sh) - Clean up various Makefiles and scripts - Fix wrong usage of {CFLAGS,LDFLAGS}_MODULE in arch Makefiles - Cache variables that are expensive to compute - Improve cc-ldopton and ld-option for Clang - Optimize output directory creation" * tag 'kbuild-v4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (30 commits) kbuild: move coccicheck help from scripts/Makefile.help to top Makefile sh: decompressor: add shipped files to .gitignore frv: .gitignore: ignore vmlinux.lds selinux: remove unnecessary assignment to subdir- kbuild: specify FORCE in Makefile.headersinst as .PHONY target kbuild: remove redundant mkdir from ./Kbuild kbuild: optimize object directory creation for incremental build kbuild: create object directories simpler and faster kbuild: filter-out PHONY targets from "targets" kbuild: remove redundant $(wildcard ...) for cmd_files calculation kbuild: create directory for make cache only when necessary sh: select KBUILD_DEFCONFIG depending on ARCH kbuild: fix linker feature test macros when cross compiling with Clang kbuild: shrink .cache.mk when it exceeds 1000 lines kbuild: do not call cc-option before KBUILD_CFLAGS initialization kbuild: Cache a few more calls to the compiler kbuild: Add a cache for generated variables kbuild: add forward declaration of default target to Makefile.asm-generic kbuild: remove KBUILD_SUBDIR_ASFLAGS and KBUILD_SUBDIR_CCFLAGS hexagon/kbuild: replace CFLAGS_MODULE with KBUILD_CFLAGS_MODULE ...
165 lines
6.2 KiB
Makefile
165 lines
6.2 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
# ==========================================================================
|
|
# Building binaries on the host system
|
|
# Binaries are used during the compilation of the kernel, for example
|
|
# to preprocess a data file.
|
|
#
|
|
# Both C and C++ are supported, but preferred language is C for such utilities.
|
|
#
|
|
# Sample syntax (see Documentation/kbuild/makefiles.txt for reference)
|
|
# hostprogs-y := bin2hex
|
|
# Will compile bin2hex.c and create an executable named bin2hex
|
|
#
|
|
# hostprogs-y := lxdialog
|
|
# lxdialog-objs := checklist.o lxdialog.o
|
|
# Will compile lxdialog.c and checklist.c, and then link the executable
|
|
# lxdialog, based on checklist.o and lxdialog.o
|
|
#
|
|
# hostprogs-y := qconf
|
|
# qconf-cxxobjs := qconf.o
|
|
# qconf-objs := menu.o
|
|
# Will compile qconf as a C++ program, and menu as a C program.
|
|
# They are linked as C++ code to the executable qconf
|
|
|
|
__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
|
|
host-cshlib := $(sort $(hostlibs-y) $(hostlibs-m))
|
|
host-cxxshlib := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m))
|
|
|
|
# C code
|
|
# Executables compiled from a single .c file
|
|
host-csingle := $(foreach m,$(__hostprogs), \
|
|
$(if $($(m)-objs)$($(m)-cxxobjs),,$(m)))
|
|
|
|
# C executables linked based on several .o files
|
|
host-cmulti := $(foreach m,$(__hostprogs),\
|
|
$(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))
|
|
|
|
# Object (.o) files compiled from .c files
|
|
host-cobjs := $(sort $(foreach m,$(__hostprogs),$($(m)-objs)))
|
|
|
|
# C++ code
|
|
# C++ executables compiled from at least one .cc file
|
|
# and zero or more .c files
|
|
host-cxxmulti := $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),$(m)))
|
|
|
|
# C++ Object (.o) files compiled from .cc files
|
|
host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
|
|
|
|
# Object (.o) files used by the shared libaries
|
|
host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
|
|
host-cxxshobjs := $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs))))
|
|
|
|
host-csingle := $(addprefix $(obj)/,$(host-csingle))
|
|
host-cmulti := $(addprefix $(obj)/,$(host-cmulti))
|
|
host-cobjs := $(addprefix $(obj)/,$(host-cobjs))
|
|
host-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti))
|
|
host-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs))
|
|
host-cshlib := $(addprefix $(obj)/,$(host-cshlib))
|
|
host-cxxshlib := $(addprefix $(obj)/,$(host-cxxshlib))
|
|
host-cshobjs := $(addprefix $(obj)/,$(host-cshobjs))
|
|
host-cxxshobjs := $(addprefix $(obj)/,$(host-cxxshobjs))
|
|
|
|
#####
|
|
# Handle options to gcc. Support building with separate output directory
|
|
|
|
_hostc_flags = $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) \
|
|
$(HOSTCFLAGS_$(basetarget).o)
|
|
_hostcxx_flags = $(HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
|
|
$(HOSTCXXFLAGS_$(basetarget).o)
|
|
|
|
ifeq ($(KBUILD_SRC),)
|
|
__hostc_flags = $(_hostc_flags)
|
|
__hostcxx_flags = $(_hostcxx_flags)
|
|
else
|
|
__hostc_flags = -I$(obj) $(call flags,_hostc_flags)
|
|
__hostcxx_flags = -I$(obj) $(call flags,_hostcxx_flags)
|
|
endif
|
|
|
|
hostc_flags = -Wp,-MD,$(depfile) $(__hostc_flags)
|
|
hostcxx_flags = -Wp,-MD,$(depfile) $(__hostcxx_flags)
|
|
|
|
#####
|
|
# Compile programs on the host
|
|
|
|
# Create executable from a single .c file
|
|
# host-csingle -> Executable
|
|
quiet_cmd_host-csingle = HOSTCC $@
|
|
cmd_host-csingle = $(HOSTCC) $(hostc_flags) -o $@ $< \
|
|
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
|
|
$(host-csingle): $(obj)/%: $(src)/%.c FORCE
|
|
$(call if_changed_dep,host-csingle)
|
|
|
|
# Link an executable based on list of .o files, all plain c
|
|
# host-cmulti -> executable
|
|
quiet_cmd_host-cmulti = HOSTLD $@
|
|
cmd_host-cmulti = $(HOSTCC) $(HOSTLDFLAGS) -o $@ \
|
|
$(addprefix $(obj)/,$($(@F)-objs)) \
|
|
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
|
|
$(host-cmulti): FORCE
|
|
$(call if_changed,host-cmulti)
|
|
$(call multi_depend, $(host-cmulti), , -objs)
|
|
|
|
# Create .o file from a single .c file
|
|
# host-cobjs -> .o
|
|
quiet_cmd_host-cobjs = HOSTCC $@
|
|
cmd_host-cobjs = $(HOSTCC) $(hostc_flags) -c -o $@ $<
|
|
$(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
|
|
$(call if_changed_dep,host-cobjs)
|
|
|
|
# Link an executable based on list of .o files, a mixture of .c and .cc
|
|
# host-cxxmulti -> executable
|
|
quiet_cmd_host-cxxmulti = HOSTLD $@
|
|
cmd_host-cxxmulti = $(HOSTCXX) $(HOSTLDFLAGS) -o $@ \
|
|
$(foreach o,objs cxxobjs,\
|
|
$(addprefix $(obj)/,$($(@F)-$(o)))) \
|
|
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
|
|
$(host-cxxmulti): FORCE
|
|
$(call if_changed,host-cxxmulti)
|
|
$(call multi_depend, $(host-cxxmulti), , -objs -cxxobjs)
|
|
|
|
# Create .o file from a single .cc (C++) file
|
|
quiet_cmd_host-cxxobjs = HOSTCXX $@
|
|
cmd_host-cxxobjs = $(HOSTCXX) $(hostcxx_flags) -c -o $@ $<
|
|
$(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE
|
|
$(call if_changed_dep,host-cxxobjs)
|
|
|
|
# Compile .c file, create position independent .o file
|
|
# host-cshobjs -> .o
|
|
quiet_cmd_host-cshobjs = HOSTCC -fPIC $@
|
|
cmd_host-cshobjs = $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $<
|
|
$(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE
|
|
$(call if_changed_dep,host-cshobjs)
|
|
|
|
# Compile .c file, create position independent .o file
|
|
# Note that plugin capable gcc versions can be either C or C++ based
|
|
# therefore plugin source files have to be compilable in both C and C++ mode.
|
|
# This is why a C++ compiler is invoked on a .c file.
|
|
# host-cxxshobjs -> .o
|
|
quiet_cmd_host-cxxshobjs = HOSTCXX -fPIC $@
|
|
cmd_host-cxxshobjs = $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $<
|
|
$(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE
|
|
$(call if_changed_dep,host-cxxshobjs)
|
|
|
|
# Link a shared library, based on position independent .o files
|
|
# *.o -> .so shared library (host-cshlib)
|
|
quiet_cmd_host-cshlib = HOSTLLD -shared $@
|
|
cmd_host-cshlib = $(HOSTCC) $(HOSTLDFLAGS) -shared -o $@ \
|
|
$(addprefix $(obj)/,$($(@F:.so=-objs))) \
|
|
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
|
|
$(host-cshlib): FORCE
|
|
$(call if_changed,host-cshlib)
|
|
$(call multi_depend, $(host-cshlib), .so, -objs)
|
|
|
|
# Link a shared library, based on position independent .o files
|
|
# *.o -> .so shared library (host-cxxshlib)
|
|
quiet_cmd_host-cxxshlib = HOSTLLD -shared $@
|
|
cmd_host-cxxshlib = $(HOSTCXX) $(HOSTLDFLAGS) -shared -o $@ \
|
|
$(addprefix $(obj)/,$($(@F:.so=-objs))) \
|
|
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
|
|
$(host-cxxshlib): FORCE
|
|
$(call if_changed,host-cxxshlib)
|
|
$(call multi_depend, $(host-cxxshlib), .so, -objs)
|
|
|
|
targets += $(host-csingle) $(host-cmulti) $(host-cobjs)\
|
|
$(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs)
|