Patchwork libcacard: add libcacard.la target

login
register
mail settings
Submitter Alon Levy
Date May 17, 2011, 12:03 p.m.
Message ID <1305633825-6171-1-git-send-email-alevy@redhat.com>
Download mbox | patch
Permalink /patch/95926/
State New
Headers show

Comments

Alon Levy - May 17, 2011, 12:03 p.m.
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(-)
Alon Levy - May 17, 2011, 12:32 p.m.
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
> 
>
Paolo Bonzini - May 18, 2011, 7:16 a.m.
On 05/18/2011 05:42 AM, Alon Levy wrote:
>>> ---
>>>   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

If you instead make the .lo rules display the error message (and add "; 
exit 1" after the echo), you can remove this ifeq.  I'll let you decide 
whether to do this or not.

Otherwise looks good, thanks!

Paolo
Alon Levy - May 18, 2011, 8:49 a.m.
On Wed, May 18, 2011 at 09:16:21AM +0200, Paolo Bonzini wrote:
> On 05/18/2011 05:42 AM, Alon Levy wrote:
> >>>---
> >>>  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
> 
> If you instead make the .lo rules display the error message (and add
> "; exit 1" after the echo), you can remove this ifeq.  I'll let you
> decide whether to do this or not.

The reason for doing the check at high level and not low level was to avoid
building any prerequisites and then find out no libtool and bail. But I think
I'll add the check at the low level too like you suggest.

> 
> Otherwise looks good, thanks!
> 
> Paolo
>

Patch

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)$@")