mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.git
				synced 2025-10-31 23:39:07 +10:00 
			
		
		
		
	[ Upstream commit30a7729771] This omits system headers from the generated header dependency. System headers are not updated unless you upgrade the compiler. Nor do they contain CONFIG options, so fixdep does not need to parse them. Having said that, the effect of this optimization will be quite small because the kernel code generally does not include system headers except <stdarg.h>. Host programs include a lot of system headers, but there are not so many in the kernel tree. At first, keeping system headers in .*.cmd files might be useful to detect the compiler update, but there is no guarantee that <stdarg.h> is included from every file. So, I implemented a more reliable way in the previous commit. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Stable-dep-of:02e9a22cee("kbuild: hdrcheck: fix cross build with clang") Signed-off-by: Sasha Levin <sashal@kernel.org>
		
			
				
	
	
		
			182 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| # SPDX-License-Identifier: GPL-2.0
 | |
| 
 | |
| # LEX
 | |
| # ---------------------------------------------------------------------------
 | |
| quiet_cmd_flex = LEX     $@
 | |
|       cmd_flex = $(LEX) -o$@ -L $<
 | |
| 
 | |
| $(obj)/%.lex.c: $(src)/%.l FORCE
 | |
| 	$(call if_changed,flex)
 | |
| 
 | |
| # YACC
 | |
| # ---------------------------------------------------------------------------
 | |
| quiet_cmd_bison = YACC    $(basename $@).[ch]
 | |
|       cmd_bison = $(YACC) -o $(basename $@).c --defines=$(basename $@).h -t -l $<
 | |
| 
 | |
| $(obj)/%.tab.c $(obj)/%.tab.h: $(src)/%.y FORCE
 | |
| 	$(call if_changed,bison)
 | |
| 
 | |
| # ==========================================================================
 | |
| # 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.rst 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   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
 | |
|                  $(HOSTCFLAGS_$(target-stem).o)
 | |
| _hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
 | |
|                  $(HOSTCXXFLAGS_$(target-stem).o)
 | |
| 
 | |
| # $(objtree)/$(obj) for including generated headers from checkin source files
 | |
| ifeq ($(KBUILD_EXTMOD),)
 | |
| ifdef building_out_of_srctree
 | |
| _hostc_flags   += -I $(objtree)/$(obj)
 | |
| _hostcxx_flags += -I $(objtree)/$(obj)
 | |
| endif
 | |
| endif
 | |
| 
 | |
| hostc_flags    = -Wp,-MMD,$(depfile) $(_hostc_flags)
 | |
| hostcxx_flags  = -Wp,-MMD,$(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) $(KBUILD_HOSTLDFLAGS) -o $@ $< \
 | |
| 		$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem))
 | |
| $(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) $(KBUILD_HOSTLDFLAGS) -o $@ \
 | |
| 			  $(addprefix $(obj)/, $($(target-stem)-objs)) \
 | |
| 			  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem))
 | |
| $(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) $(KBUILD_HOSTLDFLAGS) -o $@ \
 | |
| 			  $(foreach o,objs cxxobjs,\
 | |
| 			  $(addprefix $(obj)/, $($(target-stem)-$(o)))) \
 | |
| 			  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem))
 | |
| $(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) $(KBUILD_HOSTLDFLAGS) -shared -o $@ \
 | |
| 			  $(addprefix $(obj)/, $($(target-stem)-objs)) \
 | |
| 			  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem).so)
 | |
| $(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) $(KBUILD_HOSTLDFLAGS) -shared -o $@ \
 | |
| 			  $(addprefix $(obj)/, $($(target-stem)-objs)) \
 | |
| 			  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem).so)
 | |
| $(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)
 |