rules.mak: drop unneeded macros

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2019-12-12 13:30:36 +01:00
parent d3ca592b3c
commit 484e2cc730
6 changed files with 23 additions and 282 deletions

1
.gitignore vendored
View File

@ -80,7 +80,6 @@
*.msi *.msi
*.dll *.dll
*.so *.so
*.mo
*.fn *.fn
*.ky *.ky
*.log *.log

View File

@ -142,7 +142,7 @@ endif
include $(SRC_PATH)/tests/Makefile.include include $(SRC_PATH)/tests/Makefile.include
all: recurse-all modules all: recurse-all
# LIBFDT_lib="": avoid breaking existing trees with objects requiring -fPIC # LIBFDT_lib="": avoid breaking existing trees with objects requiring -fPIC
DTC_MAKE_ARGS=-I$(SRC_PATH)/dtc VPATH=$(SRC_PATH)/dtc -C dtc V="$(V)" LIBFDT_lib="" DTC_MAKE_ARGS=-I$(SRC_PATH)/dtc VPATH=$(SRC_PATH)/dtc -C dtc V="$(V)" LIBFDT_lib=""
@ -197,7 +197,7 @@ clean: recurse-clean ninja-clean clean-ctlist
-test -f ninjatool && ./ninjatool $(if $(V),-v,) -t clean -test -f ninjatool && ./ninjatool $(if $(V),-v,) -t clean
# avoid old build problems by removing potentially incorrect old files # avoid old build problems by removing potentially incorrect old files
rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
find . \( -name '*.so' -o -name '*.dll' -o -name '*.mo' -o -name '*.[oda]' \) -type f \ find . \( -name '*.so' -o -name '*.dll' -o -name '*.[oda]' \) -type f \
! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-aarch64.a \ ! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-aarch64.a \
! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-arm.a \ ! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-arm.a \
! -path ./roms/edk2/BaseTools/Source/Python/UPT/Dll/sqlite3.dll \ ! -path ./roms/edk2/BaseTools/Source/Python/UPT/Dll/sqlite3.dll \
@ -382,9 +382,6 @@ print-help = $(quiet-@)$(call print-help-run,$1,$2)
help: help:
@echo 'Generic targets:' @echo 'Generic targets:'
$(call print-help,all,Build all) $(call print-help,all,Build all)
ifdef CONFIG_MODULES
$(call print-help,modules,Build all modules)
endif
$(call print-help,dir/file.o,Build specified target only) $(call print-help,dir/file.o,Build specified target only)
$(call print-help,install,Install QEMU, documentation and tools) $(call print-help,install,Install QEMU, documentation and tools)
$(call print-help,ctags/TAGS,Generate tags file for editors) $(call print-help,ctags/TAGS,Generate tags file for editors)

55
configure vendored
View File

@ -78,7 +78,6 @@ TMPC="${TMPDIR1}/${TMPB}.c"
TMPO="${TMPDIR1}/${TMPB}.o" TMPO="${TMPDIR1}/${TMPB}.o"
TMPCXX="${TMPDIR1}/${TMPB}.cxx" TMPCXX="${TMPDIR1}/${TMPB}.cxx"
TMPE="${TMPDIR1}/${TMPB}.exe" TMPE="${TMPDIR1}/${TMPB}.exe"
TMPMO="${TMPDIR1}/${TMPB}.mo"
TMPTXT="${TMPDIR1}/${TMPB}.txt" TMPTXT="${TMPDIR1}/${TMPB}.txt"
rm -f config.log rm -f config.log
@ -469,7 +468,7 @@ bigendian="no"
mingw32="no" mingw32="no"
gcov="no" gcov="no"
EXESUF="" EXESUF=""
DSOSUF=".so" HOST_DSOSUF=".so"
LDFLAGS_SHARED="-shared" LDFLAGS_SHARED="-shared"
modules="no" modules="no"
module_upgrades="no" module_upgrades="no"
@ -1001,7 +1000,7 @@ fi
if test "$mingw32" = "yes" ; then if test "$mingw32" = "yes" ; then
EXESUF=".exe" EXESUF=".exe"
DSOSUF=".dll" HOST_DSOSUF=".dll"
# MinGW needs -mthreads for TLS and macro _MT. # MinGW needs -mthreads for TLS and macro _MT.
CFLAGS="-mthreads $CFLAGS" CFLAGS="-mthreads $CFLAGS"
LIBS="-lwinmm -lws2_32 $LIBS" LIBS="-lwinmm -lws2_32 $LIBS"
@ -6255,31 +6254,6 @@ EOF
fi fi
fi fi
#################################################
# Sparc implicitly links with --relax, which is
# incompatible with -r, so --no-relax should be
# given. It does no harm to give it on other
# platforms too.
# Note: the prototype is needed since QEMU_CFLAGS
# contains -Wmissing-prototypes
cat > $TMPC << EOF
extern int foo(void);
int foo(void) { return 0; }
EOF
if ! compile_object ""; then
error_exit "Failed to compile object file for LD_REL_FLAGS test"
fi
for i in '-Wl,-r -Wl,--no-relax' -Wl,-r -r; do
if do_cc -nostdlib $i -o $TMPMO $TMPO; then
LD_REL_FLAGS=$i
break
fi
done
if test "$modules" = "yes" && test "$LD_REL_FLAGS" = ""; then
feature_not_found "modules" "Cannot find how to build relocatable objects"
fi
########################################## ##########################################
# check for sysmacros.h # check for sysmacros.h
@ -7011,12 +6985,7 @@ fi
echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
for drv in $audio_drv_list; do for drv in $audio_drv_list; do
def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]') def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]')
case "$drv" in echo "$def=y" >> $config_host_mak
alsa | oss | pa | sdl)
echo "$def=m" >> $config_host_mak ;;
*)
echo "$def=y" >> $config_host_mak ;;
esac
done done
if test "$alsa" = "yes" ; then if test "$alsa" = "yes" ; then
echo "CONFIG_ALSA=y" >> $config_host_mak echo "CONFIG_ALSA=y" >> $config_host_mak
@ -7105,7 +7074,7 @@ if test "$iconv" = "yes" ; then
echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak echo "ICONV_LIBS=$iconv_lib" >> $config_host_mak
fi fi
if test "$curses" = "yes" ; then if test "$curses" = "yes" ; then
echo "CONFIG_CURSES=m" >> $config_host_mak echo "CONFIG_CURSES=y" >> $config_host_mak
echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak echo "CURSES_CFLAGS=$curses_inc" >> $config_host_mak
echo "CURSES_LIBS=$curses_lib" >> $config_host_mak echo "CURSES_LIBS=$curses_lib" >> $config_host_mak
fi fi
@ -7200,7 +7169,7 @@ if test "$bswap_h" = "yes" ; then
echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
fi fi
if test "$curl" = "yes" ; then if test "$curl" = "yes" ; then
echo "CONFIG_CURL=m" >> $config_host_mak echo "CONFIG_CURL=y" >> $config_host_mak
echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
echo "CURL_LIBS=$curl_libs" >> $config_host_mak echo "CURL_LIBS=$curl_libs" >> $config_host_mak
fi fi
@ -7209,7 +7178,7 @@ if test "$brlapi" = "yes" ; then
echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak echo "BRLAPI_LIBS=$brlapi_libs" >> $config_host_mak
fi fi
if test "$gtk" = "yes" ; then if test "$gtk" = "yes" ; then
echo "CONFIG_GTK=m" >> $config_host_mak echo "CONFIG_GTK=y" >> $config_host_mak
echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak echo "GTK_CFLAGS=$gtk_cflags" >> $config_host_mak
echo "GTK_LIBS=$gtk_libs" >> $config_host_mak echo "GTK_LIBS=$gtk_libs" >> $config_host_mak
if test "$gtk_gl" = "yes" ; then if test "$gtk_gl" = "yes" ; then
@ -7472,13 +7441,13 @@ if test "$zstd" = "yes" ; then
fi fi
if test "$libiscsi" = "yes" ; then if test "$libiscsi" = "yes" ; then
echo "CONFIG_LIBISCSI=m" >> $config_host_mak echo "CONFIG_LIBISCSI=y" >> $config_host_mak
echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
fi fi
if test "$libnfs" = "yes" ; then if test "$libnfs" = "yes" ; then
echo "CONFIG_LIBNFS=m" >> $config_host_mak echo "CONFIG_LIBNFS=y" >> $config_host_mak
echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak echo "LIBNFS_LIBS=$libnfs_libs" >> $config_host_mak
fi fi
@ -7500,7 +7469,7 @@ if test "$qom_cast_debug" = "yes" ; then
echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
fi fi
if test "$rbd" = "yes" ; then if test "$rbd" = "yes" ; then
echo "CONFIG_RBD=m" >> $config_host_mak echo "CONFIG_RBD=y" >> $config_host_mak
echo "RBD_LIBS=$rbd_libs" >> $config_host_mak echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
fi fi
@ -7572,7 +7541,7 @@ if test "$getauxval" = "yes" ; then
fi fi
if test "$glusterfs" = "yes" ; then if test "$glusterfs" = "yes" ; then
echo "CONFIG_GLUSTERFS=m" >> $config_host_mak echo "CONFIG_GLUSTERFS=y" >> $config_host_mak
echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak echo "GLUSTERFS_CFLAGS=$glusterfs_cflags" >> $config_host_mak
echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak echo "GLUSTERFS_LIBS=$glusterfs_libs" >> $config_host_mak
fi fi
@ -7602,7 +7571,7 @@ if test "$glusterfs_iocb_has_stat" = "yes" ; then
fi fi
if test "$libssh" = "yes" ; then if test "$libssh" = "yes" ; then
echo "CONFIG_LIBSSH=m" >> $config_host_mak echo "CONFIG_LIBSSH=y" >> $config_host_mak
echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak echo "LIBSSH_CFLAGS=$libssh_cflags" >> $config_host_mak
echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak echo "LIBSSH_LIBS=$libssh_libs" >> $config_host_mak
fi fi
@ -7862,7 +7831,7 @@ echo "LIBS+=$LIBS" >> $config_host_mak
echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak
echo "EXESUF=$EXESUF" >> $config_host_mak echo "EXESUF=$EXESUF" >> $config_host_mak
echo "DSOSUF=$DSOSUF" >> $config_host_mak echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak
echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak
echo "LIBS_QGA=$libs_qga" >> $config_host_mak echo "LIBS_QGA=$libs_qga" >> $config_host_mak
echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak

View File

@ -404,10 +404,7 @@ using Makefile.target for the build rules.
- rules.mak - rules.mak
This file provides the generic helper rules for invoking build tools, in This file provides the generic helper rules for invoking build tools, in
particular the compiler and linker. This also contains the magic (hairy) particular the compiler and linker.
'unnest-vars' function which is used to merge the variable definitions
from all Makefile.objs in the source tree down into the main Makefile
context.
- default-configs/*.mak - default-configs/*.mak

231
rules.mak
View File

@ -33,11 +33,6 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(@D)/$(*F).d
# different for target-dependent ones. # different for target-dependent ones.
QEMU_LOCAL_INCLUDES = -iquote $(BUILD_DIR) -iquote $(BUILD_DIR)/$(@D) -iquote $(@D) QEMU_LOCAL_INCLUDES = -iquote $(BUILD_DIR) -iquote $(BUILD_DIR)/$(@D) -iquote $(@D)
WL_U := -Wl,-u,
find-symbols = $(if $1, $(sort $(shell $(NM) -P -g $1 | $2)))
defined-symbols = $(call find-symbols,$1,awk '$$2!="U"{print $$1}')
undefined-symbols = $(call find-symbols,$1,awk '$$2=="U"{print $$1}')
WL := -Wl, WL := -Wl,
ifdef CONFIG_DARWIN ifdef CONFIG_DARWIN
whole-archive = $(WL)-force_load,$1 whole-archive = $(WL)-force_load,$1
@ -45,32 +40,7 @@ else
whole-archive = $(WL)--whole-archive $1 $(WL)--no-whole-archive whole-archive = $(WL)--whole-archive $1 $(WL)--no-whole-archive
endif endif
# All the .mo objects in -m variables are also added into corresponding -y extract-libs = $(strip $(foreach o,$1,$($o-libs)))
# variable in unnest-vars, but filtered out here, when LINK is called.
#
# The .mo objects are supposed to be linked as a DSO, for module build. So here
# they are only used as a placeholders to generate those "archive undefined"
# symbol options (-Wl,-u,$symbol_name), which are the archive functions
# referenced by the code in the DSO.
#
# Also the presence in -y variables will also guarantee they are built before
# linking executables that will load them. So we can look up symbol reference
# in LINK.
#
# This is necessary because the exectuable itself may not use the function, in
# which case the function would not be linked in. Then the DSO loading will
# fail because of the missing symbol.
process-archive-undefs = $(filter-out %.a %.fa %.mo %$(DSOSUF),$1) \
$(addprefix $(WL_U), \
$(filter $(call defined-symbols,$(filter %.a %.fa, $1)), \
$(call undefined-symbols,$(filter %.mo %$(DSOSUF),$1)))) \
$(foreach l,$(filter %.fa,$1),$(call whole-archive,$l)) \
$(filter %.a,$1)
extract-libs = $(strip $(foreach o,$(filter-out %.mo %$(DSOSUF),$1),$($o-libs)))
expand-objs = $(strip $(sort $(filter %.o,$1)) \
$(foreach o,$(filter %.mo %$(DSOSUF),$1),$($o-objs)) \
$(filter-out %.o %.mo %$(DSOSUF),$1))
%.o: %.c %.o: %.c
@mkdir -p $(dir $@) @mkdir -p $(dir $@)
@ -83,7 +53,9 @@ expand-objs = $(strip $(sort $(filter %.o,$1)) \
LINKPROG = $(or $(CXX),$(CC)) LINKPROG = $(or $(CXX),$(CC))
LINK = $(call quiet-command, $(LINKPROG) $(CFLAGS) $(QEMU_LDFLAGS) -o $@ \ LINK = $(call quiet-command, $(LINKPROG) $(CFLAGS) $(QEMU_LDFLAGS) -o $@ \
$(call process-archive-undefs, $1) \ $(filter-out %.a %.fa,$1) \
$(foreach l,$(filter %.fa,$1),$(call whole-archive,$l)) \
$(filter %.a,$1) \
$(call extract-libs,$1) $(LIBS),"LINK","$(TARGET_DIR)$@") $(call extract-libs,$1) $(LIBS),"LINK","$(TARGET_DIR)$@")
%.o: %.S %.o: %.S
@ -109,25 +81,11 @@ LINK = $(call quiet-command, $(LINKPROG) $(CFLAGS) $(QEMU_LDFLAGS) -o $@ \
%.o: %.dtrace %.o: %.dtrace
$(call quiet-command,dtrace -o $@ -G -s $<,"GEN","$(TARGET_DIR)$@") $(call quiet-command,dtrace -o $@ -G -s $<,"GEN","$(TARGET_DIR)$@")
DSO_OBJ_CFLAGS := -fPIC -DBUILD_DSO
module-common.o: CFLAGS += $(DSO_OBJ_CFLAGS)
%$(DSOSUF): QEMU_LDFLAGS += $(LDFLAGS_SHARED)
%$(DSOSUF): %.mo
$(call LINK,$^)
@# Copy to build root so modules can be loaded when program started without install
$(if $(findstring /,$@),$(call quiet-command,cp $@ $(subst /,-,$@),"CP","$(subst /,-,$@)"))
LD_REL := $(CC) -nostdlib $(LD_REL_FLAGS)
%.mo:
$(call quiet-command,$(LD_REL) -o $@ $^,"LD","$(TARGET_DIR)$@")
.PHONY: modules .PHONY: modules
modules: modules:
%$(EXESUF): %.o %$(EXESUF): %.o
$(call LINK,$(filter %.o %.a %.mo %.fa, $^)) $(call LINK,$(filter %.o %.a %.fa, $^))
%.a: %.a:
$(call quiet-command,rm -f $@ && $(AR) rcs $@ $^,"AR","$(TARGET_DIR)$@") $(call quiet-command,rm -f $@ && $(AR) rcs $@ $^,"AR","$(TARGET_DIR)$@")
@ -160,15 +118,6 @@ define install-prog
$(if $(STRIP),$(STRIP) $(foreach T,$1,"$2/$(notdir $T)"),) $(if $(STRIP),$(STRIP) $(foreach T,$1,"$2/$(notdir $T)"),)
endef endef
# find-in-path
# Usage: $(call find-in-path, prog)
# Looks in the PATH if the argument contains no slash, else only considers one
# specific directory. Returns an # empty string if the program doesn't exist
# there.
find-in-path = $(if $(findstring /, $1), \
$(wildcard $1), \
$(wildcard $(patsubst %, %/$1, $(subst :, ,$(PATH)))))
# Logical functions (for operating on y/n values like CONFIG_FOO vars) # Logical functions (for operating on y/n values like CONFIG_FOO vars)
# Inputs to these must be either "y" (true) or "n" or "" (both false) # Inputs to these must be either "y" (true) or "n" or "" (both false)
# Output is always either "y" or "n". # Output is always either "y" or "n".
@ -205,175 +154,5 @@ clean: clean-timestamp
# will delete the target of a rule if commands exit with a nonzero exit status # will delete the target of a rule if commands exit with a nonzero exit status
.DELETE_ON_ERROR: .DELETE_ON_ERROR:
# save-vars
# Usage: $(call save-vars, vars)
# Save each variable $v in $vars as save-vars-$v, save their object's
# variables, then clear $v. saved-vars-$v contains the variables that
# where saved for the objects, in order to speedup load-vars.
define save-vars
$(foreach v,$1,
$(eval save-vars-$v := $(value $v))
$(eval saved-vars-$v := $(foreach o,$($v), \
$(if $($o-cflags), $o-cflags $(eval save-vars-$o-cflags := $($o-cflags))$(eval $o-cflags := )) \
$(if $($o-libs), $o-libs $(eval save-vars-$o-libs := $($o-libs))$(eval $o-libs := )) \
$(if $($o-objs), $o-objs $(eval save-vars-$o-objs := $($o-objs))$(eval $o-objs := ))))
$(eval $v := ))
endef
# load-vars
# Usage: $(call load-vars, vars, add_var)
# Load the saved value for each variable in @vars, and the per object
# variables.
# Append @add_var's current value to the loaded value.
define load-vars
$(eval $2-new-value := $(value $2))
$(foreach v,$1,
$(eval $v := $(value save-vars-$v))
$(foreach o,$(saved-vars-$v),
$(eval $o := $(save-vars-$o)) $(eval save-vars-$o := ))
$(eval save-vars-$v := )
$(eval saved-vars-$v := ))
$(eval $2 := $(value $2) $($2-new-value))
endef
# fix-paths
# Usage: $(call fix-paths, obj_path, src_path, vars)
# Add prefix @obj_path to all objects in @vars, and add prefix @src_path to all
# directories in @vars.
define fix-paths
$(foreach v,$3,
$(foreach o,$($v),
$(if $($o-libs),
$(eval $1$o-libs := $($o-libs)))
$(if $($o-cflags),
$(eval $1$o-cflags := $($o-cflags)))
$(if $($o-objs),
$(eval $1$o-objs := $(addprefix $1,$($o-objs)))))
$(eval $v := $(addprefix $1,$(filter-out %/,$($v))) \
$(addprefix $2,$(filter %/,$($v)))))
endef
# unnest-var-recursive
# Usage: $(call unnest-var-recursive, obj_prefix, vars, var)
#
# Unnest @var by including subdir Makefile.objs, while protect others in @vars
# unchanged.
#
# @obj_prefix is the starting point of object path prefix.
#
define unnest-var-recursive
$(eval dirs := $(sort $(filter %/,$($3))))
$(eval $3 := $(filter-out %/,$($3)))
$(foreach d,$(dirs:%/=%),
$(call save-vars,$2)
$(eval obj := $(if $1,$1/)$d)
$(eval -include $(SRC_PATH)/$d/Makefile.objs)
$(call fix-paths,$(if $1,$1/)$d/,$d/,$2)
$(call load-vars,$2,$3)
$(call unnest-var-recursive,$1,$2,$3))
endef
# unnest-vars
# Usage: $(call unnest-vars, obj_prefix, vars)
#
# @obj_prefix: object path prefix, can be empty, or '..', etc. Don't include
# ending '/'.
#
# @vars: the list of variable names to unnest.
#
# This macro will scan subdirectories's Makefile.objs, include them, to build
# up each variable listed in @vars.
#
# Per object and per module cflags and libs are saved with relative path fixed
# as well, those variables include -libs, -cflags and -objs. Items in -objs are
# also fixed to relative path against SRC_PATH plus the prefix @obj_prefix.
#
# All nested variables postfixed by -m in names are treated as DSO variables,
# and will be built as modules, if enabled.
#
# A simple example of the unnest:
#
# obj_prefix = ..
# vars = hot cold
# hot = fire.o sun.o season/
# cold = snow.o water/ season/
#
# Unnest through a faked source directory structure:
#
# SRC_PATH
# ├── water
# │ └── Makefile.objs──────────────────┐
# │ │ hot += steam.o │
# │ │ cold += ice.mo │
# │ │ ice.mo-libs := -licemaker │
# │ │ ice.mo-objs := ice1.o ice2.o │
# │ └──────────────────────────────┘
# │
# └── season
# └── Makefile.objs──────┐
# │ hot += summer.o │
# │ cold += winter.o │
# └──────────────────┘
#
# In the end, the result will be:
#
# hot = ../fire.o ../sun.o ../season/summer.o
# cold = ../snow.o ../water/ice.mo ../season/winter.o
# ../water/ice.mo-libs = -licemaker
# ../water/ice.mo-objs = ../water/ice1.o ../water/ice2.o
#
# Note that 'hot' didn't include 'water/' in the input, so 'steam.o' is not
# included.
#
define unnest-vars
# In the case of target build (i.e. $1 == ..), fix path for top level
# Makefile.objs objects
$(if $1,$(call fix-paths,$1/,,$2))
# Descend and include every subdir Makefile.objs
$(foreach v, $2,
$(call unnest-var-recursive,$1,$2,$v)
# Pass the .mo-cflags and .mo-libs along to its member objects
$(foreach o, $(filter %.mo,$($v)),
$(foreach p,$($o-objs),
$(if $($o-cflags), $(eval $p-cflags += $($o-cflags)))
$(if $($o-libs), $(eval $p-libs += $($o-libs))))))
# For all %.mo objects that are directly added into -y, just expand them
$(foreach v,$(filter %-y,$2),
$(eval $v := $(foreach o,$($v),$(if $($o-objs),$($o-objs),$o))))
$(foreach v,$(filter %-m,$2),
# All .o found in *-m variables are single object modules, create .mo
# for them
$(foreach o,$(filter %.o,$($v)),
$(eval $(o:%.o=%.mo)-objs := $o))
# Now unify .o in -m variable to .mo
$(eval $v := $($v:%.o=%.mo))
$(eval modules-m += $($v))
# For module build, build shared libraries during "make modules"
# For non-module build, add -m to -y
$(if $(CONFIG_MODULES),
$(foreach o,$($v),
$(eval $($o-objs): CFLAGS += $(DSO_OBJ_CFLAGS))
$(eval $o: $($o-objs)))
$(eval $(patsubst %-m,%-y,$v) += $($v))
$(eval modules: $($v:%.mo=%$(DSOSUF))),
$(eval $(patsubst %-m,%-y,$v) += $(call expand-objs, $($v)))))
# Post-process all the unnested vars
$(foreach v,$2,
$(foreach o, $(filter %.mo,$($v)),
# Find all the .mo objects in variables and add dependency rules
# according to .mo-objs. Report error if not set
$(if $($o-objs),
$(eval $(o:%.mo=%$(DSOSUF)): module-common.o $($o-objs))))
$(shell mkdir -p ./ $(sort $(dir $($v))))
# Include all the .d files
$(eval -include $(patsubst %.o,%.d,$(patsubst %.mo,%.d,$(filter %.o,$($v)))))
$(eval $v := $(filter-out %/,$($v))))
endef
print-%: print-%:
@echo '$*=$($*)' @echo '$*=$($*)'

View File

@ -91,6 +91,9 @@ case $line in
name=${line%=*} name=${line%=*}
echo "#define $name 1" echo "#define $name 1"
;; ;;
HOST_DSOSUF=*)
echo "#define HOST_DSOSUF \"${line#*=}\""
;;
HOST_*=*) # configuration HOST_*=*) # configuration
name=${line%=*} name=${line%=*}
value=${line#*=} value=${line#*=}
@ -123,9 +126,6 @@ case $line in
value=${line#*=} value=${line#*=}
echo "#define $name $value" echo "#define $name $value"
;; ;;
DSOSUF=*)
echo "#define HOST_DSOSUF \"${line#*=}\""
;;
esac esac
done # read done # read