On Tue, May 17, 2011 at 03:03:45PM +0300, Alon Levy wrote: Forgot to mention this is the v3, with the following fixes: * no warning, properly use libtool to wrap dtrace (which calls gcc). * tested with all tracing backends but ust (and in the process of testing that) * moved general rule for producing .lo to rules.mak, with the exception (trace-dtrace.lo) in Makefile.objs (same as trace-dtrace.o rule) * fixed clean to remove the artifacts.
> No flag to configure is required. Instead, added a libcacard.la target that > is not built by default, only when requested explicitly via: > > mkdir build > cd build > ../configure > make libcacard.la > make install-libcacard > > Uses libtool to do actual linking of object files and shared library, and > installing. Tested only under linux, but supposed to work on other systems as > well. > > If libtool isn't found you get a message complaining about that, only at build > time (since it is not a default target I did not add a message at configure > time). > > New build artifacts: > .libs subdirectories (at <buildroot> and <buildroot>/libcacard) > *.lo files (at same locations as the respective o files) > > Added %.lo : %.c rule that uses libtool. > Updated clean rule to clean up those artifacts. > Added specific rule to call dtrace with libtool wrapper (note that because of > a current upstream dtrace bug fixed by systemtap b1568fd85 commit the -fPIC > flag > isn't actually passed on. still current dtrace+libtool produced object links > fine). > > Tested to link and load with all tracing backends except ust (no default > package > for my development computer for ust). > --- > Makefile | 20 +++++++++++++++++++- > Makefile.objs | 3 +++ > configure | 12 +++++++++++- > libcacard/Makefile | 32 ++++++++++++++++++++++++++++---- > rules.mak | 3 +++ > 5 files changed, 64 insertions(+), 6 deletions(-) > > diff --git a/Makefile b/Makefile > index 2b0438c..c71026c 100644 > --- a/Makefile > +++ b/Makefile > @@ -119,6 +119,23 @@ version.o: $(SRC_PATH)/version.rc config-host.mak > > version-obj-$(CONFIG_WIN32) += version.o > ###################################################################### > +# Support building shared library libcacard > + > +.PHONY: libcacard.la install-libcacard > +ifeq ($(LIBTOOL),) > +libcacard.la: > + @echo libtool is missing, please install and rerun configure > + > +install-libcacard: > + @echo libtool is missing, please install and rerun configure > +else > +libcacard.la: $(GENERATED_HEADERS) $(oslib-obj-y) qemu-malloc.o > qemu-timer-common.o $(addsuffix .lo, $(basename $(trace-obj-y))) > + $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libcacard V="$(V)" > TARGET_DIR="$*/" libcacard.la,) > + > +install-libcacard: libcacard.la > + $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libcacard V="$(V)" > TARGET_DIR="$*/" install-libcacard,) > +endif > +###################################################################### > > qemu-img.o: qemu-img-cmds.h > qemu-img.o qemu-tool.o qemu-nbd.o qemu-io.o cmd.o: $(GENERATED_HEADERS) > @@ -149,7 +166,8 @@ clean: > # 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 qemu-options.def > - rm -f *.o *.d *.a $(TOOLS) TAGS cscope.* *.pod *~ */*~ > + rm -f *.o *.d *.a *.lo $(TOOLS) TAGS cscope.* *.pod *~ */*~ > + rm -Rf .libs > rm -f slirp/*.o slirp/*.d audio/*.o audio/*.d block/*.o block/*.d > net/*.o net/*.d fsdev/*.o fsdev/*.d ui/*.o ui/*.d > rm -f qemu-img-cmds.h > rm -f trace.c trace.h trace.c-timestamp trace.h-timestamp > diff --git a/Makefile.objs b/Makefile.objs > index 4478c61..850e707 100644 > --- a/Makefile.objs > +++ b/Makefile.objs > @@ -344,6 +344,9 @@ trace-dtrace.dtrace-timestamp: $(SRC_PATH)/trace-events > config-host.mak > trace-dtrace.o: trace-dtrace.dtrace $(GENERATED_HEADERS) > $(call quiet-command,dtrace -o $@ -G -s $<, " GEN trace-dtrace.o") > > +trace-dtrace.lo: trace-dtrace.dtrace > + $(call quiet-command,libtool --mode=compile --tag=CC dtrace -o $@ -G -s > $<, " lt GEN trace-dtrace.o") > + > simpletrace.o: simpletrace.c $(GENERATED_HEADERS) > > ifeq ($(TRACE_BACKEND),dtrace) > diff --git a/configure b/configure > index 0627f1d..e62841e 100755 > --- a/configure > +++ b/configure > @@ -1276,6 +1276,15 @@ if ! has $pkg_config; then > fi > > ########################################## > +# libtool probe > + > +if ! has libtool; then > + libtool= > +else > + libtool=libtool > +fi > + > +########################################## > # Sparse probe > if test "$sparse" != "no" ; then > if has cgcc; then > @@ -3060,6 +3069,7 @@ echo "AR=$ar" >> $config_host_mak > echo "OBJCOPY=$objcopy" >> $config_host_mak > echo "LD=$ld" >> $config_host_mak > echo "WINDRES=$windres" >> $config_host_mak > +echo "LIBTOOL=$libtool" >> $config_host_mak > echo "CFLAGS=$CFLAGS" >> $config_host_mak > echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak > echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak > @@ -3595,7 +3605,7 @@ if [ "$source_path" != `pwd` ]; then > # out of tree build > mkdir -p libcacard > rm -f libcacard/Makefile > - ln -s "$source_path/libcacard/Makefile" libcacard/Makefile > + symlink "$source_path/libcacard/Makefile" libcacard/Makefile > fi > > d=libuser > diff --git a/libcacard/Makefile b/libcacard/Makefile > index 1d34df0..a35bca4 100644 > --- a/libcacard/Makefile > +++ b/libcacard/Makefile > @@ -4,15 +4,39 @@ > > $(call set-vpath, $(SRC_PATH):$(SRC_PATH)/libcacard) > > -QEMU_OBJS=$(addprefix ../, $(oslib-obj-y) $(trace-obj-y) qemu-malloc.o > qemu-timer-common.o) > +# objects linked against normal qemu binaries, not compiled with libtool > +QEMU_OBJS=$(addprefix ../,$(oslib-obj-y) qemu-malloc.o qemu-timer-common.o > $(trace-obj-y)) > + > +# objects linked into a shared library, built with libtool with -fPIC if > required > +QEMU_OBJS_LIB=$(addsuffix .lo,$(basename $(QEMU_OBJS))) > > QEMU_CFLAGS+=-I../ > > +libcacard.lib-y=$(addsuffix .lo,$(basename $(libcacard-y))) > + > vscclient: $(libcacard-y) $(QEMU_OBJS) vscclient.o > - $(call quiet-command,$(CC) $(libcacard_libs) -lrt -o $@ $^," LINK > $(TARGET_DIR)$@") > + $(call quiet-command,$(CC) $(libcacard_libs) -lrt -o $@ $^," LINK $@") > + > +clean: > + rm -f *.o */*.o *.d */*.d *.a */*.a *~ */*~ vscclient *.lo .libs/* *.la > + rm -Rf .libs > > all: vscclient > > -clean: > - rm -f *.o */*.o *.d */*.d *.a */*.a *~ */*~ vscclient > +######################################################################### > +# Rules for building libcacard standalone library > + > +ifeq ($(LIBTOOL),) > +libcacard.la: > + @echo libtool is missing, please install and rerun configure > + > +install-libcacard: > + @echo libtool is missing, please install and rerun configure > +else > +libcacard.la: $(libcacard.lib-y) $(QEMU_OBJS_LIB) > + $(call quiet-command,libtool --mode=link --quiet --tag=CC $(CC) > $(libcacard_libs) -lrt -rpath $(libdir) -o $@ $^," lt LINK $@") > > +install-libcacard: libcacard.la > + $(INSTALL_DIR) "$(DESTDIR)$(libdir)" > + libtool --mode=install $(INSTALL_PROG) libcacard.la > "$(DESTDIR)$(libdir)" > +endif > diff --git a/rules.mak b/rules.mak > index ed59c9e..509cc01 100644 > --- a/rules.mak > +++ b/rules.mak > @@ -17,6 +17,9 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d > %.o: %.c > $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(QEMU_INCLUDES) > $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<," CC $(TARGET_DIR)$@") > > +%.lo: %.c > + $(call quiet-command,libtool --mode=compile --quiet --tag=CC $(CC) > $(QEMU_CFLAGS) $(QEMU_INCLUDES) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<," lt > CC $@") > + > %.o: %.S > $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(QEMU_INCLUDES) > $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<," AS $(TARGET_DIR)$@") > > -- > 1.7.5.1 > >