mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
![Matthias Kaehlcke](/assets/img/avatar_default.png)
cc-option uses KBUILD_CFLAGS and KBUILD_CPPFLAGS when it determines whether an option is supported or not. This is fine for options used to build the kernel itself, however some components like the x86 boot code use a different set of flags. Add the new macro __cc-option which is a more generic version of cc-option with additional parameters. One parameter is the compiler with which the check should be performed, the other the compiler options to be used instead KBUILD_C*FLAGS. Refactor cc-option and hostcc-option to use __cc-option and move hostcc-option to scripts/Kbuild.include. Suggested-by: Arnd Bergmann <arnd@arndb.de> Suggested-by: Masahiro Yamada <yamada.masahiro@socionext.com> Signed-off-by: Matthias Kaehlcke <mka@chromium.org> Acked-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Michal Marek <mmarek@suse.com> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
175 lines
6.6 KiB
Makefile
175 lines
6.6 KiB
Makefile
# ==========================================================================
|
|
# 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))))
|
|
|
|
# output directory for programs/.o files
|
|
# hostprogs-y := tools/build may have been specified.
|
|
# Retrieve also directory of .o files from prog-objs or prog-cxxobjs notation
|
|
host-objdirs := $(dir $(__hostprogs) $(host-cobjs) $(host-cxxobjs))
|
|
|
|
host-objdirs := $(strip $(sort $(filter-out ./,$(host-objdirs))))
|
|
|
|
|
|
__hostprogs := $(addprefix $(obj)/,$(__hostprogs))
|
|
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))
|
|
host-objdirs := $(addprefix $(obj)/,$(host-objdirs))
|
|
|
|
obj-dirs += $(host-objdirs)
|
|
|
|
#####
|
|
# 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)
|