xref: /linux-6.15/scripts/Makefile.host (revision cf8dfd15)
1b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0
2*cf8dfd15SMasahiro Yamada
3*cf8dfd15SMasahiro Yamada# LEX
4*cf8dfd15SMasahiro Yamada# ---------------------------------------------------------------------------
5*cf8dfd15SMasahiro Yamadaquiet_cmd_flex = LEX     $@
6*cf8dfd15SMasahiro Yamada      cmd_flex = $(LEX) -o$@ -L $<
7*cf8dfd15SMasahiro Yamada
8*cf8dfd15SMasahiro Yamada$(obj)/%.lex.c: $(src)/%.l FORCE
9*cf8dfd15SMasahiro Yamada	$(call if_changed,flex)
10*cf8dfd15SMasahiro Yamada
11*cf8dfd15SMasahiro Yamada# YACC
12*cf8dfd15SMasahiro Yamada# ---------------------------------------------------------------------------
13*cf8dfd15SMasahiro Yamadaquiet_cmd_bison = YACC    $(basename $@).[ch]
14*cf8dfd15SMasahiro Yamada      cmd_bison = $(YACC) -o $(basename $@).c --defines=$(basename $@).h -t -l $<
15*cf8dfd15SMasahiro Yamada
16*cf8dfd15SMasahiro Yamada$(obj)/%.tab.c $(obj)/%.tab.h: $(src)/%.y FORCE
17*cf8dfd15SMasahiro Yamada	$(call if_changed,bison)
18*cf8dfd15SMasahiro Yamada
191da177e4SLinus Torvalds# ==========================================================================
201da177e4SLinus Torvalds# Building binaries on the host system
211da177e4SLinus Torvalds# Binaries are used during the compilation of the kernel, for example
221da177e4SLinus Torvalds# to preprocess a data file.
231da177e4SLinus Torvalds#
243156fd05SRobert P. J. Day# Both C and C++ are supported, but preferred language is C for such utilities.
251da177e4SLinus Torvalds#
26cd238effSMauro Carvalho Chehab# Sample syntax (see Documentation/kbuild/makefiles.rst for reference)
271da177e4SLinus Torvalds# hostprogs-y := bin2hex
281da177e4SLinus Torvalds# Will compile bin2hex.c and create an executable named bin2hex
291da177e4SLinus Torvalds#
301da177e4SLinus Torvalds# hostprogs-y    := lxdialog
311da177e4SLinus Torvalds# lxdialog-objs := checklist.o lxdialog.o
321da177e4SLinus Torvalds# Will compile lxdialog.c and checklist.c, and then link the executable
331da177e4SLinus Torvalds# lxdialog, based on checklist.o and lxdialog.o
341da177e4SLinus Torvalds#
351da177e4SLinus Torvalds# hostprogs-y      := qconf
361da177e4SLinus Torvalds# qconf-cxxobjs   := qconf.o
371da177e4SLinus Torvalds# qconf-objs      := menu.o
381da177e4SLinus Torvalds# Will compile qconf as a C++ program, and menu as a C program.
391da177e4SLinus Torvalds# They are linked as C++ code to the executable qconf
401da177e4SLinus Torvalds
411da177e4SLinus Torvalds__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
4224403874SEmese Revfyhost-cshlib := $(sort $(hostlibs-y) $(hostlibs-m))
4324403874SEmese Revfyhost-cxxshlib := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m))
441da177e4SLinus Torvalds
451da177e4SLinus Torvalds# C code
461da177e4SLinus Torvalds# Executables compiled from a single .c file
47edb950c1SMasahiro Yamadahost-csingle	:= $(foreach m,$(__hostprogs), \
48edb950c1SMasahiro Yamada			$(if $($(m)-objs)$($(m)-cxxobjs),,$(m)))
491da177e4SLinus Torvalds
501da177e4SLinus Torvalds# C executables linked based on several .o files
511da177e4SLinus Torvaldshost-cmulti	:= $(foreach m,$(__hostprogs),\
521da177e4SLinus Torvalds		   $(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))
531da177e4SLinus Torvalds
541da177e4SLinus Torvalds# Object (.o) files compiled from .c files
551da177e4SLinus Torvaldshost-cobjs	:= $(sort $(foreach m,$(__hostprogs),$($(m)-objs)))
561da177e4SLinus Torvalds
571da177e4SLinus Torvalds# C++ code
58d8d9efe2SMasahiro Yamada# C++ executables compiled from at least one .cc file
591da177e4SLinus Torvalds# and zero or more .c files
601da177e4SLinus Torvaldshost-cxxmulti	:= $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),$(m)))
611da177e4SLinus Torvalds
621da177e4SLinus Torvalds# C++ Object (.o) files compiled from .cc files
631da177e4SLinus Torvaldshost-cxxobjs	:= $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
641da177e4SLinus Torvalds
6524403874SEmese Revfy# Object (.o) files used by the shared libaries
6624403874SEmese Revfyhost-cshobjs	:= $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
6724403874SEmese Revfyhost-cxxshobjs	:= $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs))))
6824403874SEmese Revfy
691da177e4SLinus Torvaldshost-csingle	:= $(addprefix $(obj)/,$(host-csingle))
701da177e4SLinus Torvaldshost-cmulti	:= $(addprefix $(obj)/,$(host-cmulti))
711da177e4SLinus Torvaldshost-cobjs	:= $(addprefix $(obj)/,$(host-cobjs))
721da177e4SLinus Torvaldshost-cxxmulti	:= $(addprefix $(obj)/,$(host-cxxmulti))
731da177e4SLinus Torvaldshost-cxxobjs	:= $(addprefix $(obj)/,$(host-cxxobjs))
7424403874SEmese Revfyhost-cshlib	:= $(addprefix $(obj)/,$(host-cshlib))
7524403874SEmese Revfyhost-cxxshlib	:= $(addprefix $(obj)/,$(host-cxxshlib))
7624403874SEmese Revfyhost-cshobjs	:= $(addprefix $(obj)/,$(host-cshobjs))
7724403874SEmese Revfyhost-cxxshobjs	:= $(addprefix $(obj)/,$(host-cxxshobjs))
781da177e4SLinus Torvalds
791da177e4SLinus Torvalds#####
801da177e4SLinus Torvalds# Handle options to gcc. Support building with separate output directory
811da177e4SLinus Torvalds
8296f14fe7SLaura Abbott_hostc_flags   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
835e8d780dSSam Ravnborg                 $(HOSTCFLAGS_$(basetarget).o)
8410844aebSLaura Abbott_hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
855e8d780dSSam Ravnborg                 $(HOSTCXXFLAGS_$(basetarget).o)
861da177e4SLinus Torvalds
87cdd750bfSMasahiro Yamada# $(objtree)/$(obj) for including generated headers from checkin source files
8858156ba4SMasahiro Yamadaifeq ($(KBUILD_EXTMOD),)
89051f278eSMasahiro Yamadaifdef building_out_of_srctree
90cdd750bfSMasahiro Yamada_hostc_flags   += -I $(objtree)/$(obj)
91cdd750bfSMasahiro Yamada_hostcxx_flags += -I $(objtree)/$(obj)
921da177e4SLinus Torvaldsendif
9358156ba4SMasahiro Yamadaendif
941da177e4SLinus Torvalds
95cdd750bfSMasahiro Yamadahostc_flags    = -Wp,-MD,$(depfile) $(_hostc_flags)
96cdd750bfSMasahiro Yamadahostcxx_flags  = -Wp,-MD,$(depfile) $(_hostcxx_flags)
971da177e4SLinus Torvalds
981da177e4SLinus Torvalds#####
991da177e4SLinus Torvalds# Compile programs on the host
1001da177e4SLinus Torvalds
1011da177e4SLinus Torvalds# Create executable from a single .c file
1021da177e4SLinus Torvalds# host-csingle -> Executable
1031da177e4SLinus Torvaldsquiet_cmd_host-csingle 	= HOSTCC  $@
104b90a3680SLaura Abbott      cmd_host-csingle	= $(HOSTCC) $(hostc_flags) $(KBUILD_HOSTLDFLAGS) -o $@ $< \
1058377bd2bSLaura Abbott		$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
106767e581dSSam Ravnborg$(host-csingle): $(obj)/%: $(src)/%.c FORCE
1071da177e4SLinus Torvalds	$(call if_changed_dep,host-csingle)
1081da177e4SLinus Torvalds
1091da177e4SLinus Torvalds# Link an executable based on list of .o files, all plain c
1101da177e4SLinus Torvalds# host-cmulti -> executable
1111da177e4SLinus Torvaldsquiet_cmd_host-cmulti	= HOSTLD  $@
112b90a3680SLaura Abbott      cmd_host-cmulti	= $(HOSTCC) $(KBUILD_HOSTLDFLAGS) -o $@ \
1131da177e4SLinus Torvalds			  $(addprefix $(obj)/,$($(@F)-objs)) \
1148377bd2bSLaura Abbott			  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
11597e3226eSMasahiro Yamada$(host-cmulti): FORCE
1161da177e4SLinus Torvalds	$(call if_changed,host-cmulti)
11797e3226eSMasahiro Yamada$(call multi_depend, $(host-cmulti), , -objs)
1181da177e4SLinus Torvalds
1191da177e4SLinus Torvalds# Create .o file from a single .c file
1201da177e4SLinus Torvalds# host-cobjs -> .o
1211da177e4SLinus Torvaldsquiet_cmd_host-cobjs	= HOSTCC  $@
1221da177e4SLinus Torvalds      cmd_host-cobjs	= $(HOSTCC) $(hostc_flags) -c -o $@ $<
123767e581dSSam Ravnborg$(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
1241da177e4SLinus Torvalds	$(call if_changed_dep,host-cobjs)
1251da177e4SLinus Torvalds
1261da177e4SLinus Torvalds# Link an executable based on list of .o files, a mixture of .c and .cc
1271da177e4SLinus Torvalds# host-cxxmulti -> executable
1281da177e4SLinus Torvaldsquiet_cmd_host-cxxmulti	= HOSTLD  $@
129b90a3680SLaura Abbott      cmd_host-cxxmulti	= $(HOSTCXX) $(KBUILD_HOSTLDFLAGS) -o $@ \
1301da177e4SLinus Torvalds			  $(foreach o,objs cxxobjs,\
1311da177e4SLinus Torvalds			  $(addprefix $(obj)/,$($(@F)-$(o)))) \
1328377bd2bSLaura Abbott			  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
13397e3226eSMasahiro Yamada$(host-cxxmulti): FORCE
1341da177e4SLinus Torvalds	$(call if_changed,host-cxxmulti)
13597e3226eSMasahiro Yamada$(call multi_depend, $(host-cxxmulti), , -objs -cxxobjs)
1361da177e4SLinus Torvalds
1371da177e4SLinus Torvalds# Create .o file from a single .cc (C++) file
1381da177e4SLinus Torvaldsquiet_cmd_host-cxxobjs	= HOSTCXX $@
1391da177e4SLinus Torvalds      cmd_host-cxxobjs	= $(HOSTCXX) $(hostcxx_flags) -c -o $@ $<
140767e581dSSam Ravnborg$(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE
1411da177e4SLinus Torvalds	$(call if_changed_dep,host-cxxobjs)
1421da177e4SLinus Torvalds
14324403874SEmese Revfy# Compile .c file, create position independent .o file
14424403874SEmese Revfy# host-cshobjs -> .o
14524403874SEmese Revfyquiet_cmd_host-cshobjs	= HOSTCC  -fPIC $@
14624403874SEmese Revfy      cmd_host-cshobjs	= $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $<
14724403874SEmese Revfy$(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE
14824403874SEmese Revfy	$(call if_changed_dep,host-cshobjs)
14924403874SEmese Revfy
15024403874SEmese Revfy# Compile .c file, create position independent .o file
15124403874SEmese Revfy# Note that plugin capable gcc versions can be either C or C++ based
15224403874SEmese Revfy# therefore plugin source files have to be compilable in both C and C++ mode.
15324403874SEmese Revfy# This is why a C++ compiler is invoked on a .c file.
15424403874SEmese Revfy# host-cxxshobjs -> .o
15524403874SEmese Revfyquiet_cmd_host-cxxshobjs	= HOSTCXX -fPIC $@
15624403874SEmese Revfy      cmd_host-cxxshobjs	= $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $<
15724403874SEmese Revfy$(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE
15824403874SEmese Revfy	$(call if_changed_dep,host-cxxshobjs)
15924403874SEmese Revfy
16024403874SEmese Revfy# Link a shared library, based on position independent .o files
16124403874SEmese Revfy# *.o -> .so shared library (host-cshlib)
16224403874SEmese Revfyquiet_cmd_host-cshlib	= HOSTLLD -shared $@
163b90a3680SLaura Abbott      cmd_host-cshlib	= $(HOSTCC) $(KBUILD_HOSTLDFLAGS) -shared -o $@ \
16424403874SEmese Revfy			  $(addprefix $(obj)/,$($(@F:.so=-objs))) \
1658377bd2bSLaura Abbott			  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
16624403874SEmese Revfy$(host-cshlib): FORCE
16724403874SEmese Revfy	$(call if_changed,host-cshlib)
16824403874SEmese Revfy$(call multi_depend, $(host-cshlib), .so, -objs)
16924403874SEmese Revfy
17024403874SEmese Revfy# Link a shared library, based on position independent .o files
17124403874SEmese Revfy# *.o -> .so shared library (host-cxxshlib)
17224403874SEmese Revfyquiet_cmd_host-cxxshlib	= HOSTLLD -shared $@
173b90a3680SLaura Abbott      cmd_host-cxxshlib	= $(HOSTCXX) $(KBUILD_HOSTLDFLAGS) -shared -o $@ \
17424403874SEmese Revfy			  $(addprefix $(obj)/,$($(@F:.so=-objs))) \
1758377bd2bSLaura Abbott			  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
17624403874SEmese Revfy$(host-cxxshlib): FORCE
17724403874SEmese Revfy	$(call if_changed,host-cxxshlib)
17824403874SEmese Revfy$(call multi_depend, $(host-cxxshlib), .so, -objs)
17924403874SEmese Revfy
1801da177e4SLinus Torvaldstargets += $(host-csingle)  $(host-cmulti) $(host-cobjs)\
18124403874SEmese Revfy	   $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs)
182