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