1*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun# LEX 4*4882a593Smuzhiyun# --------------------------------------------------------------------------- 5*4882a593Smuzhiyunquiet_cmd_flex = LEX $@ 6*4882a593Smuzhiyun cmd_flex = $(LEX) -o$@ -L $< 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun$(obj)/%.lex.c: $(src)/%.l FORCE 9*4882a593Smuzhiyun $(call if_changed,flex) 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun# YACC 12*4882a593Smuzhiyun# --------------------------------------------------------------------------- 13*4882a593Smuzhiyunquiet_cmd_bison = YACC $(basename $@).[ch] 14*4882a593Smuzhiyun cmd_bison = $(YACC) -o $(basename $@).c --defines=$(basename $@).h -t -l $< 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun$(obj)/%.tab.c $(obj)/%.tab.h: $(src)/%.y FORCE 17*4882a593Smuzhiyun $(call if_changed,bison) 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun# ========================================================================== 20*4882a593Smuzhiyun# Building binaries on the host system 21*4882a593Smuzhiyun# Binaries are used during the compilation of the kernel, for example 22*4882a593Smuzhiyun# to preprocess a data file. 23*4882a593Smuzhiyun# 24*4882a593Smuzhiyun# Both C and C++ are supported, but preferred language is C for such utilities. 25*4882a593Smuzhiyun# 26*4882a593Smuzhiyun# Sample syntax (see Documentation/kbuild/makefiles.rst for reference) 27*4882a593Smuzhiyun# hostprogs := bin2hex 28*4882a593Smuzhiyun# Will compile bin2hex.c and create an executable named bin2hex 29*4882a593Smuzhiyun# 30*4882a593Smuzhiyun# hostprogs := lxdialog 31*4882a593Smuzhiyun# lxdialog-objs := checklist.o lxdialog.o 32*4882a593Smuzhiyun# Will compile lxdialog.c and checklist.c, and then link the executable 33*4882a593Smuzhiyun# lxdialog, based on checklist.o and lxdialog.o 34*4882a593Smuzhiyun# 35*4882a593Smuzhiyun# hostprogs := qconf 36*4882a593Smuzhiyun# qconf-cxxobjs := qconf.o 37*4882a593Smuzhiyun# qconf-objs := menu.o 38*4882a593Smuzhiyun# Will compile qconf as a C++ program, and menu as a C program. 39*4882a593Smuzhiyun# They are linked as C++ code to the executable qconf 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun# C code 42*4882a593Smuzhiyun# Executables compiled from a single .c file 43*4882a593Smuzhiyunhost-csingle := $(foreach m,$(hostprogs), \ 44*4882a593Smuzhiyun $(if $($(m)-objs)$($(m)-cxxobjs),,$(m))) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun# C executables linked based on several .o files 47*4882a593Smuzhiyunhost-cmulti := $(foreach m,$(hostprogs),\ 48*4882a593Smuzhiyun $(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m)))) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun# Object (.o) files compiled from .c files 51*4882a593Smuzhiyunhost-cobjs := $(sort $(foreach m,$(hostprogs),$($(m)-objs))) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun# C++ code 54*4882a593Smuzhiyun# C++ executables compiled from at least one .cc file 55*4882a593Smuzhiyun# and zero or more .c files 56*4882a593Smuzhiyunhost-cxxmulti := $(foreach m,$(hostprogs),$(if $($(m)-cxxobjs),$(m))) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun# C++ Object (.o) files compiled from .cc files 59*4882a593Smuzhiyunhost-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs))) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyunhost-csingle := $(addprefix $(obj)/,$(host-csingle)) 62*4882a593Smuzhiyunhost-cmulti := $(addprefix $(obj)/,$(host-cmulti)) 63*4882a593Smuzhiyunhost-cobjs := $(addprefix $(obj)/,$(host-cobjs)) 64*4882a593Smuzhiyunhost-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti)) 65*4882a593Smuzhiyunhost-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs)) 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun##### 68*4882a593Smuzhiyun# Handle options to gcc. Support building with separate output directory 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun_hostc_flags = $(KBUILD_HOSTCFLAGS) $(HOST_EXTRACFLAGS) \ 71*4882a593Smuzhiyun $(HOSTCFLAGS_$(target-stem).o) 72*4882a593Smuzhiyun_hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \ 73*4882a593Smuzhiyun $(HOSTCXXFLAGS_$(target-stem).o) 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun# $(objtree)/$(obj) for including generated headers from checkin source files 76*4882a593Smuzhiyunifeq ($(KBUILD_EXTMOD),) 77*4882a593Smuzhiyunifdef building_out_of_srctree 78*4882a593Smuzhiyun_hostc_flags += -I $(objtree)/$(obj) 79*4882a593Smuzhiyun_hostcxx_flags += -I $(objtree)/$(obj) 80*4882a593Smuzhiyunendif 81*4882a593Smuzhiyunendif 82*4882a593Smuzhiyun 83*4882a593Smuzhiyunhostc_flags = -Wp,-MMD,$(depfile) $(_hostc_flags) 84*4882a593Smuzhiyunhostcxx_flags = -Wp,-MMD,$(depfile) $(_hostcxx_flags) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun##### 87*4882a593Smuzhiyun# Compile programs on the host 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun# Create executable from a single .c file 90*4882a593Smuzhiyun# host-csingle -> Executable 91*4882a593Smuzhiyunquiet_cmd_host-csingle = HOSTCC $@ 92*4882a593Smuzhiyun cmd_host-csingle = $(HOSTCC) $(hostc_flags) $(KBUILD_HOSTLDFLAGS) -o $@ $< \ 93*4882a593Smuzhiyun $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem)) 94*4882a593Smuzhiyun$(host-csingle): $(obj)/%: $(src)/%.c FORCE 95*4882a593Smuzhiyun $(call if_changed_dep,host-csingle) 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun# Link an executable based on list of .o files, all plain c 98*4882a593Smuzhiyun# host-cmulti -> executable 99*4882a593Smuzhiyunquiet_cmd_host-cmulti = HOSTLD $@ 100*4882a593Smuzhiyun cmd_host-cmulti = $(HOSTCC) $(KBUILD_HOSTLDFLAGS) -o $@ \ 101*4882a593Smuzhiyun $(addprefix $(obj)/, $($(target-stem)-objs)) \ 102*4882a593Smuzhiyun $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem)) 103*4882a593Smuzhiyun$(host-cmulti): FORCE 104*4882a593Smuzhiyun $(call if_changed,host-cmulti) 105*4882a593Smuzhiyun$(call multi_depend, $(host-cmulti), , -objs) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun# Create .o file from a single .c file 108*4882a593Smuzhiyun# host-cobjs -> .o 109*4882a593Smuzhiyunquiet_cmd_host-cobjs = HOSTCC $@ 110*4882a593Smuzhiyun cmd_host-cobjs = $(HOSTCC) $(hostc_flags) -c -o $@ $< 111*4882a593Smuzhiyun$(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE 112*4882a593Smuzhiyun $(call if_changed_dep,host-cobjs) 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun# Link an executable based on list of .o files, a mixture of .c and .cc 115*4882a593Smuzhiyun# host-cxxmulti -> executable 116*4882a593Smuzhiyunquiet_cmd_host-cxxmulti = HOSTLD $@ 117*4882a593Smuzhiyun cmd_host-cxxmulti = $(HOSTCXX) $(KBUILD_HOSTLDFLAGS) -o $@ \ 118*4882a593Smuzhiyun $(foreach o,objs cxxobjs,\ 119*4882a593Smuzhiyun $(addprefix $(obj)/, $($(target-stem)-$(o)))) \ 120*4882a593Smuzhiyun $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(target-stem)) 121*4882a593Smuzhiyun$(host-cxxmulti): FORCE 122*4882a593Smuzhiyun $(call if_changed,host-cxxmulti) 123*4882a593Smuzhiyun$(call multi_depend, $(host-cxxmulti), , -objs -cxxobjs) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun# Create .o file from a single .cc (C++) file 126*4882a593Smuzhiyunquiet_cmd_host-cxxobjs = HOSTCXX $@ 127*4882a593Smuzhiyun cmd_host-cxxobjs = $(HOSTCXX) $(hostcxx_flags) -c -o $@ $< 128*4882a593Smuzhiyun$(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE 129*4882a593Smuzhiyun $(call if_changed_dep,host-cxxobjs) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyuntargets += $(host-csingle) $(host-cmulti) $(host-cobjs) \ 132*4882a593Smuzhiyun $(host-cxxmulti) $(host-cxxobjs) 133