mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-08 13:17:52 +00:00
rules.mak: introduce DSO rules
Add necessary rules and flags for shared object generation. The new rules introduced here are: 1) %.o in $(common-obj-m) is compiled to %.o, then linked to %.so. 2) %.mo in $(common-obj-m) is the placeholder for %.so for pattern matching in Makefile. It's linked to "-shared" with all its dependencies (multiple *.o) as input. Which means the list of depended objects must be specified in each sub-Makefile.objs: foo.mo-objs := bar.o baz.o qux.o in the same style with foo.o-cflags and foo.o-libs. The objects here will be prefixed with "$(obj)/" if it's a subdirectory Makefile.objs. 3) For all files ending up in %.so, the following is added automatically: foo.o-cflags += -fPIC -DBUILD_DSO Also introduce --enable-modules in configure, the option will enable support of shared object build. Otherwise objects are static linked to executables. Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
13b6ce0ec9
commit
17969268f5
3
.gitignore
vendored
3
.gitignore
vendored
@ -64,6 +64,9 @@ libuser
|
|||||||
*.cp
|
*.cp
|
||||||
*.dvi
|
*.dvi
|
||||||
*.exe
|
*.exe
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.mo
|
||||||
*.fn
|
*.fn
|
||||||
*.ky
|
*.ky
|
||||||
*.log
|
*.log
|
||||||
|
4
Makefile
4
Makefile
@ -138,7 +138,7 @@ ifeq ($(CONFIG_SMARTCARD_NSS),y)
|
|||||||
include $(SRC_PATH)/libcacard/Makefile
|
include $(SRC_PATH)/libcacard/Makefile
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all
|
all: $(DOCS) $(TOOLS) $(HELPERS-y) recurse-all modules
|
||||||
|
|
||||||
vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
|
vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
|
||||||
|
|
||||||
@ -256,6 +256,8 @@ clean:
|
|||||||
rm -f qemu-options.def
|
rm -f qemu-options.def
|
||||||
find . -name '*.[oda]' -type f -exec rm -f {} +
|
find . -name '*.[oda]' -type f -exec rm -f {} +
|
||||||
find . -name '*.l[oa]' -type f -exec rm -f {} +
|
find . -name '*.l[oa]' -type f -exec rm -f {} +
|
||||||
|
find . -name '*$(DSOSUF)' -type f -exec rm -f {} +
|
||||||
|
find . -name '*.mo' -type f -exec rm -f {} +
|
||||||
rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
|
rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
|
||||||
rm -f fsdev/*.pod
|
rm -f fsdev/*.pod
|
||||||
rm -rf .libs */.libs
|
rm -rf .libs */.libs
|
||||||
|
15
configure
vendored
15
configure
vendored
@ -205,6 +205,9 @@ mingw32="no"
|
|||||||
gcov="no"
|
gcov="no"
|
||||||
gcov_tool="gcov"
|
gcov_tool="gcov"
|
||||||
EXESUF=""
|
EXESUF=""
|
||||||
|
DSOSUF=".so"
|
||||||
|
LDFLAGS_SHARED="-shared"
|
||||||
|
modules="no"
|
||||||
prefix="/usr/local"
|
prefix="/usr/local"
|
||||||
mandir="\${prefix}/share/man"
|
mandir="\${prefix}/share/man"
|
||||||
datadir="\${prefix}/share"
|
datadir="\${prefix}/share"
|
||||||
@ -515,6 +518,7 @@ OpenBSD)
|
|||||||
Darwin)
|
Darwin)
|
||||||
bsd="yes"
|
bsd="yes"
|
||||||
darwin="yes"
|
darwin="yes"
|
||||||
|
LDFLAGS_SHARED="-bundle -undefined dynamic_lookup"
|
||||||
if [ "$cpu" = "x86_64" ] ; then
|
if [ "$cpu" = "x86_64" ] ; then
|
||||||
QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
|
QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
|
||||||
LDFLAGS="-arch x86_64 $LDFLAGS"
|
LDFLAGS="-arch x86_64 $LDFLAGS"
|
||||||
@ -608,6 +612,7 @@ fi
|
|||||||
|
|
||||||
if test "$mingw32" = "yes" ; then
|
if test "$mingw32" = "yes" ; then
|
||||||
EXESUF=".exe"
|
EXESUF=".exe"
|
||||||
|
DSOSUF=".dll"
|
||||||
QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS"
|
QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS"
|
||||||
# enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
|
# enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
|
||||||
QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS"
|
QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS"
|
||||||
@ -674,6 +679,9 @@ for opt do
|
|||||||
;;
|
;;
|
||||||
--disable-debug-info)
|
--disable-debug-info)
|
||||||
;;
|
;;
|
||||||
|
--enable-modules)
|
||||||
|
modules="yes"
|
||||||
|
;;
|
||||||
--cpu=*)
|
--cpu=*)
|
||||||
;;
|
;;
|
||||||
--target-list=*) target_list="$optarg"
|
--target-list=*) target_list="$optarg"
|
||||||
@ -1130,6 +1138,7 @@ Advanced options (experts only):
|
|||||||
--sysconfdir=PATH install config in PATH$confsuffix
|
--sysconfdir=PATH install config in PATH$confsuffix
|
||||||
--localstatedir=PATH install local state in PATH (set at runtime on win32)
|
--localstatedir=PATH install local state in PATH (set at runtime on win32)
|
||||||
--with-confsuffix=SUFFIX suffix for QEMU data inside datadir and sysconfdir [$confsuffix]
|
--with-confsuffix=SUFFIX suffix for QEMU data inside datadir and sysconfdir [$confsuffix]
|
||||||
|
--enable-modules enable modules support
|
||||||
--enable-debug-tcg enable TCG debugging
|
--enable-debug-tcg enable TCG debugging
|
||||||
--disable-debug-tcg disable TCG debugging (default)
|
--disable-debug-tcg disable TCG debugging (default)
|
||||||
--enable-debug-info enable debugging information (default)
|
--enable-debug-info enable debugging information (default)
|
||||||
@ -3768,6 +3777,7 @@ echo "python $python"
|
|||||||
if test "$slirp" = "yes" ; then
|
if test "$slirp" = "yes" ; then
|
||||||
echo "smbd $smbd"
|
echo "smbd $smbd"
|
||||||
fi
|
fi
|
||||||
|
echo "module support $modules"
|
||||||
echo "host CPU $cpu"
|
echo "host CPU $cpu"
|
||||||
echo "host big endian $bigendian"
|
echo "host big endian $bigendian"
|
||||||
echo "target list $target_list"
|
echo "target list $target_list"
|
||||||
@ -4012,6 +4022,9 @@ echo "TARGET_DIRS=$target_list" >> $config_host_mak
|
|||||||
if [ "$docs" = "yes" ] ; then
|
if [ "$docs" = "yes" ] ; then
|
||||||
echo "BUILD_DOCS=yes" >> $config_host_mak
|
echo "BUILD_DOCS=yes" >> $config_host_mak
|
||||||
fi
|
fi
|
||||||
|
if test "$modules" = "yes"; then
|
||||||
|
echo "CONFIG_MODULES=y" >> $config_host_mak
|
||||||
|
fi
|
||||||
if test "$sdl" = "yes" ; then
|
if test "$sdl" = "yes" ; then
|
||||||
echo "CONFIG_SDL=y" >> $config_host_mak
|
echo "CONFIG_SDL=y" >> $config_host_mak
|
||||||
echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
|
echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
|
||||||
@ -4396,6 +4409,8 @@ echo "LIBTOOLFLAGS=$LIBTOOLFLAGS" >> $config_host_mak
|
|||||||
echo "LIBS+=$LIBS" >> $config_host_mak
|
echo "LIBS+=$LIBS" >> $config_host_mak
|
||||||
echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
|
echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
|
||||||
echo "EXESUF=$EXESUF" >> $config_host_mak
|
echo "EXESUF=$EXESUF" >> $config_host_mak
|
||||||
|
echo "DSOSUF=$DSOSUF" >> $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 "POD2MAN=$POD2MAN" >> $config_host_mak
|
echo "POD2MAN=$POD2MAN" >> $config_host_mak
|
||||||
echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
|
echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
|
||||||
|
52
rules.mak
52
rules.mak
@ -22,7 +22,12 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
|
|||||||
# Same as -I$(SRC_PATH) -I., but for the nested source/object directories
|
# Same as -I$(SRC_PATH) -I., but for the nested source/object directories
|
||||||
QEMU_INCLUDES += -I$(<D) -I$(@D)
|
QEMU_INCLUDES += -I$(<D) -I$(@D)
|
||||||
|
|
||||||
extract-libs = $(strip $(foreach o,$1,$($o-libs)))
|
maybe-add = $(filter-out $1, $2) $1
|
||||||
|
extract-libs = $(strip $(sort $(foreach o,$1,$($o-libs)) \
|
||||||
|
$(foreach o,$(call expand-objs,$1),$($o-libs))))
|
||||||
|
expand-objs = $(strip $(sort $(filter %.o,$1)) \
|
||||||
|
$(foreach o,$(filter %.mo,$1),$($o-objs)) \
|
||||||
|
$(filter-out %.o %.mo,$1))
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $<," CC $(TARGET_DIR)$@")
|
$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) -c -o $@ $<," CC $(TARGET_DIR)$@")
|
||||||
@ -35,8 +40,8 @@ LINKPROG = $(or $(CXX),$(CC))
|
|||||||
|
|
||||||
ifeq ($(LIBTOOL),)
|
ifeq ($(LIBTOOL),)
|
||||||
LINK = $(call quiet-command,$(LINKPROG) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
|
LINK = $(call quiet-command,$(LINKPROG) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
|
||||||
$(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(version-obj-y) \
|
$(call expand-objs,$1) $(version-obj-y) \
|
||||||
$(call extract-libs,$^) $(LIBS)," LINK $(TARGET_DIR)$@")
|
$(call extract-libs,$1) $(LIBS)," LINK $(TARGET_DIR)$@")
|
||||||
else
|
else
|
||||||
LIBTOOL += $(if $(V),,--quiet)
|
LIBTOOL += $(if $(V),,--quiet)
|
||||||
%.lo: %.c
|
%.lo: %.c
|
||||||
@ -47,12 +52,12 @@ LIBTOOL += $(if $(V),,--quiet)
|
|||||||
$(call quiet-command,$(LIBTOOL) --mode=compile --tag=CC dtrace -o $@ -G -s $<, " lt GEN $(TARGET_DIR)$@")
|
$(call quiet-command,$(LIBTOOL) --mode=compile --tag=CC dtrace -o $@ -G -s $<, " lt GEN $(TARGET_DIR)$@")
|
||||||
|
|
||||||
LINK = $(call quiet-command,\
|
LINK = $(call quiet-command,\
|
||||||
$(if $(filter %.lo %.la,$^),$(LIBTOOL) --mode=link --tag=CC \
|
$(if $(filter %.lo %.la,$1),$(LIBTOOL) --mode=link --tag=CC \
|
||||||
)$(LINKPROG) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
|
)$(LINKPROG) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
|
||||||
$(sort $(filter %.o, $1)) $(filter-out %.o, $1) \
|
$(call expand-objs,$1) \
|
||||||
$(if $(filter %.lo %.la,$^),$(version-lobj-y),$(version-obj-y)) \
|
$(if $(filter %.lo %.la,$1),$(version-lobj-y),$(version-obj-y)) \
|
||||||
$(if $(filter %.lo %.la,$^),$(LIBTOOLFLAGS)) \
|
$(if $(filter %.lo %.la,$1),$(LIBTOOLFLAGS)) \
|
||||||
$(call extract-libs,$^) $(LIBS),$(if $(filter %.lo %.la,$^),"lt LINK ", " LINK ")"$(TARGET_DIR)$@")
|
$(call extract-libs,$1) $(LIBS),$(if $(filter %.lo %.la,$1),"lt LINK ", " LINK ")"$(TARGET_DIR)$@")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
%.asm: %.S
|
%.asm: %.S
|
||||||
@ -73,6 +78,14 @@ endif
|
|||||||
%.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_CFLAGS := -fPIC -DBUILD_DSO
|
||||||
|
%$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
|
||||||
|
%$(DSOSUF): %.mo libqemustub.a
|
||||||
|
$(call LINK,$^)
|
||||||
|
|
||||||
|
.PHONY: modules
|
||||||
|
modules:
|
||||||
|
|
||||||
%$(EXESUF): %.o
|
%$(EXESUF): %.o
|
||||||
$(call LINK,$^)
|
$(call LINK,$^)
|
||||||
|
|
||||||
@ -166,7 +179,10 @@ $(foreach v,$($1), \
|
|||||||
$(eval $v-cflags := )) \
|
$(eval $v-cflags := )) \
|
||||||
$(if $($v-libs), \
|
$(if $($v-libs), \
|
||||||
$(eval $2$v-libs := $($v-libs)) \
|
$(eval $2$v-libs := $($v-libs)) \
|
||||||
$(eval $v-libs := )))
|
$(eval $v-libs := )) \
|
||||||
|
$(if $($v-objs), \
|
||||||
|
$(eval $2$v-objs := $(addprefix $2,$($v-objs))) \
|
||||||
|
$(eval $v-objs := )))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define unnest-dir
|
define unnest-dir
|
||||||
@ -190,6 +206,22 @@ $(if $(nested-dirs),
|
|||||||
$(call unnest-vars-1))
|
$(call unnest-vars-1))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
define process-modules
|
||||||
|
$(foreach o,$(filter %.o,$($1)),
|
||||||
|
$(eval $(patsubst %.o,%.mo,$o): $o) \
|
||||||
|
$(eval $(patsubst %.o,%.mo,$o)-objs := $o))
|
||||||
|
$(foreach o,$(filter-out $(modules-m), $(patsubst %.o,%.mo,$($1))), \
|
||||||
|
$(eval $o: $($o-objs))
|
||||||
|
$(eval modules-objs-m += $($o-objs))
|
||||||
|
$(eval modules-m += $o)
|
||||||
|
$(eval $o:; $$(call quiet-command,touch $$@," GEN $$(TARGET_DIR)$$@"))
|
||||||
|
$(if $(CONFIG_MODULES),$(eval modules: $(patsubst %.mo,%$(DSOSUF),$o)))) \
|
||||||
|
$(eval modules-objs-m := $(sort $(modules-objs-m)))
|
||||||
|
$(foreach o,$(modules-objs-m), \
|
||||||
|
$(if $(CONFIG_MODULES),$(eval $o-cflags := $(call maybe-add, $(DSO_CFLAGS), $($o-cflags)))))
|
||||||
|
$(eval $(patsubst %-m,%-$(call lnot,$(CONFIG_MODULES)),$1) += $($1))
|
||||||
|
endef
|
||||||
|
|
||||||
define unnest-vars
|
define unnest-vars
|
||||||
$(eval obj := $1)
|
$(eval obj := $1)
|
||||||
$(eval nested-vars := $2)
|
$(eval nested-vars := $2)
|
||||||
@ -201,4 +233,6 @@ $(foreach var,$(nested-vars),$(eval $(var) := $(filter-out %/, $($(var)))))
|
|||||||
$(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
|
$(shell mkdir -p $(sort $(foreach var,$(nested-vars),$(dir $($(var))))))
|
||||||
$(foreach var,$(nested-vars), $(eval \
|
$(foreach var,$(nested-vars), $(eval \
|
||||||
-include $(addsuffix *.d, $(sort $(dir $($(var)))))))
|
-include $(addsuffix *.d, $(sort $(dir $($(var)))))))
|
||||||
|
$(foreach v,$(filter %-m,$(nested-vars)), \
|
||||||
|
$(call process-modules,$v))
|
||||||
endef
|
endef
|
||||||
|
Loading…
x
Reference in New Issue
Block a user