2005-04-17 02:20:36 +04:00
# ==========================================================================
# Building binaries on the host system
# Binaries are used during the compilation of the kernel, for example
# to preprocess a data file.
#
2008-02-18 12:48:20 +03:00
# Both C and C++ are supported, but preferred language is C for such utilities.
2005-04-17 02:20:36 +04:00
#
2008-02-18 12:48:20 +03:00
# Sample syntax (see Documentation/kbuild/makefiles.txt for reference)
2005-04-17 02:20:36 +04:00
# 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
2016-05-24 01:08:25 +03:00
# hostcc-option
# Usage: cflags-y += $(call hostcc-option,-march=winchip-c6,-march=i586)
hostcc-option = $( call try-run,\
$( HOSTCC) $( HOSTCFLAGS) $( HOST_EXTRACFLAGS) $( 1) -c -x c /dev/null -o " $$ TMP " ,$( 1) ,$( 2) )
2006-09-16 23:15:39 +04:00
__hostprogs := $( sort $( hostprogs-y) $( hostprogs-m) )
2016-05-24 01:08:25 +03:00
host-cshlib := $( sort $( hostlibs-y) $( hostlibs-m) )
host-cxxshlib := $( sort $( hostcxxlibs-y) $( hostcxxlibs-m) )
2005-04-17 02:20:36 +04:00
# C code
# Executables compiled from a single .c file
2014-07-16 11:12:20 +04:00
host-csingle := $( foreach m,$( __hostprogs) , \
$( if $( $( m) -objs) $( $( m) -cxxobjs) ,,$( m) ) )
2005-04-17 02:20:36 +04:00
# 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
2014-07-16 11:12:19 +04:00
# C++ executables compiled from at least one .cc file
2005-04-17 02:20:36 +04:00
# 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) ) )
2016-05-24 01:08:25 +03:00
# 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) ) ) )
2006-08-07 23:55:33 +04:00
# output directory for programs/.o files
2014-07-16 11:12:23 +04:00
# hostprogs-y := tools/build may have been specified.
# Retrieve also directory of .o files from prog-objs or prog-cxxobjs notation
host-objdirs := $( dir $( __hostprogs) $( host-cobjs) $( host-cxxobjs) )
2006-08-07 23:55:33 +04:00
host-objdirs := $( strip $( sort $( filter-out ./,$( host-objdirs) ) ) )
2005-04-17 02:20:36 +04:00
__hostprogs := $( addprefix $( obj) /,$( __hostprogs) )
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) )
2016-05-24 01:08:25 +03:00
host-cshlib := $( addprefix $( obj) /,$( host-cshlib) )
host-cxxshlib := $( addprefix $( obj) /,$( host-cxxshlib) )
host-cshobjs := $( addprefix $( obj) /,$( host-cshobjs) )
host-cxxshobjs := $( addprefix $( obj) /,$( host-cxxshobjs) )
2006-06-02 05:28:50 +04:00
host-objdirs := $( addprefix $( obj) /,$( host-objdirs) )
obj-dirs += $( host-objdirs)
2005-04-17 02:20:36 +04:00
#####
# Handle options to gcc. Support building with separate output directory
2006-07-01 11:58:02 +04:00
_hostc_flags = $( HOSTCFLAGS) $( HOST_EXTRACFLAGS) \
$( HOSTCFLAGS_$( basetarget) .o)
_hostcxx_flags = $( HOSTCXXFLAGS) $( HOST_EXTRACXXFLAGS) \
$( HOSTCXXFLAGS_$( basetarget) .o)
2005-04-17 02:20:36 +04:00
i f e q ( $( KBUILD_SRC ) , )
__hostc_flags = $( _hostc_flags)
__hostcxx_flags = $( _hostcxx_flags)
e l s e
__hostc_flags = -I$( obj) $( call flags,_hostc_flags)
__hostcxx_flags = -I$( obj) $( call flags,_hostcxx_flags)
e n d i f
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 $@
2005-02-18 12:23:41 +03:00
cmd_host-csingle = $( HOSTCC) $( hostc_flags) -o $@ $< \
$( HOST_LOADLIBES) $( HOSTLOADLIBES_$( @F) )
2007-05-06 11:23:45 +04:00
$(host-csingle) : $( obj ) /%: $( src ) /%.c FORCE
2005-04-17 02:20:36 +04:00
$( 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) )
2014-08-19 11:34:21 +04:00
$(host-cmulti) : FORCE
2005-04-17 02:20:36 +04:00
$( call if_changed,host-cmulti)
2014-08-19 11:34:21 +04:00
$( call multi_depend , $ ( host -cmulti ) , , -objs )
2005-04-17 02:20:36 +04:00
# Create .o file from a single .c file
# host-cobjs -> .o
quiet_cmd_host-cobjs = HOSTCC $@
cmd_host-cobjs = $( HOSTCC) $( hostc_flags) -c -o $@ $<
2007-05-06 11:23:45 +04:00
$(host-cobjs) : $( obj ) /%.o : $( src ) /%.c FORCE
2005-04-17 02:20:36 +04:00
$( 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) )
2014-08-19 11:34:21 +04:00
$(host-cxxmulti) : FORCE
2005-04-17 02:20:36 +04:00
$( call if_changed,host-cxxmulti)
2014-08-19 11:34:21 +04:00
$( call multi_depend , $ ( host -cxxmulti ) , , -objs -cxxobjs )
2005-04-17 02:20:36 +04:00
# Create .o file from a single .cc (C++) file
quiet_cmd_host-cxxobjs = HOSTCXX $@
cmd_host-cxxobjs = $( HOSTCXX) $( hostcxx_flags) -c -o $@ $<
2007-05-06 11:23:45 +04:00
$(host-cxxobjs) : $( obj ) /%.o : $( src ) /%.cc FORCE
2005-04-17 02:20:36 +04:00
$( call if_changed_dep,host-cxxobjs)
2016-05-24 01:08:25 +03:00
# 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 )
2005-04-17 02:20:36 +04:00
targets += $( host-csingle) $( host-cmulti) $( host-cobjs) \
2016-05-24 01:08:25 +03:00
$( host-cxxmulti) $( host-cxxobjs) $( host-cshlib) $( host-cshobjs) $( host-cxxshlib) $( host-cxxshobjs)