Makefile.host 6.2 KB
Newer Older
1
# SPDX-License-Identifier: GPL-2.0
L
Linus Torvalds 已提交
2 3 4 5 6
# ==========================================================================
# Building binaries on the host system
# Binaries are used during the compilation of the kernel, for example
# to preprocess a data file.
#
R
Robert P. J. Day 已提交
7
# Both C and C++ are supported, but preferred language is C for such utilities.
L
Linus Torvalds 已提交
8
#
R
Robert P. J. Day 已提交
9
# Sample syntax (see Documentation/kbuild/makefiles.txt for reference)
L
Linus Torvalds 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23
# 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

24
__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
E
Emese Revfy 已提交
25 26
host-cshlib := $(sort $(hostlibs-y) $(hostlibs-m))
host-cxxshlib := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m))
L
Linus Torvalds 已提交
27 28 29

# C code
# Executables compiled from a single .c file
30 31
host-csingle	:= $(foreach m,$(__hostprogs), \
			$(if $($(m)-objs)$($(m)-cxxobjs),,$(m)))
L
Linus Torvalds 已提交
32 33 34 35 36 37 38 39 40

# 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
41
# C++ executables compiled from at least one .cc file
L
Linus Torvalds 已提交
42 43 44 45 46 47
# 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)))

E
Emese Revfy 已提交
48 49 50 51
# 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))))

L
Linus Torvalds 已提交
52 53 54 55 56
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))
E
Emese Revfy 已提交
57 58 59 60
host-cshlib	:= $(addprefix $(obj)/,$(host-cshlib))
host-cxxshlib	:= $(addprefix $(obj)/,$(host-cxxshlib))
host-cshobjs	:= $(addprefix $(obj)/,$(host-cshobjs))
host-cxxshobjs	:= $(addprefix $(obj)/,$(host-cxxshobjs))
L
Linus Torvalds 已提交
61 62 63 64

#####
# Handle options to gcc. Support building with separate output directory

65
_hostc_flags   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
66 67 68
                 $(HOSTCFLAGS_$(basetarget).o)
_hostcxx_flags = $(HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
                 $(HOSTCXXFLAGS_$(basetarget).o)
L
Linus Torvalds 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

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  $@
87
      cmd_host-csingle	= $(HOSTCC) $(hostc_flags) $(HOSTLDFLAGS) -o $@ $< \
88
	  	$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
89
$(host-csingle): $(obj)/%: $(src)/%.c FORCE
L
Linus Torvalds 已提交
90 91 92 93 94 95 96 97
	$(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))
98
$(host-cmulti): FORCE
L
Linus Torvalds 已提交
99
	$(call if_changed,host-cmulti)
100
$(call multi_depend, $(host-cmulti), , -objs)
L
Linus Torvalds 已提交
101 102 103 104 105

# Create .o file from a single .c file
# host-cobjs -> .o
quiet_cmd_host-cobjs	= HOSTCC  $@
      cmd_host-cobjs	= $(HOSTCC) $(hostc_flags) -c -o $@ $<
106
$(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
L
Linus Torvalds 已提交
107 108 109 110 111 112 113 114 115
	$(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))
116
$(host-cxxmulti): FORCE
L
Linus Torvalds 已提交
117
	$(call if_changed,host-cxxmulti)
118
$(call multi_depend, $(host-cxxmulti), , -objs -cxxobjs)
L
Linus Torvalds 已提交
119 120 121 122

# Create .o file from a single .cc (C++) file
quiet_cmd_host-cxxobjs	= HOSTCXX $@
      cmd_host-cxxobjs	= $(HOSTCXX) $(hostcxx_flags) -c -o $@ $<
123
$(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE
L
Linus Torvalds 已提交
124 125
	$(call if_changed_dep,host-cxxobjs)

E
Emese Revfy 已提交
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
# 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)

L
Linus Torvalds 已提交
163
targets += $(host-csingle)  $(host-cmulti) $(host-cobjs)\
E
Emese Revfy 已提交
164
	   $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs)