* [PATCH V3] kvm tools: Add build target for statically-linked binary
@ 2012-02-02 2:47 Matt Evans
2012-02-02 3:03 ` Asias He
0 siblings, 1 reply; 3+ messages in thread
From: Matt Evans @ 2012-02-02 2:47 UTC (permalink / raw)
To: KVM list; +Cc: Pekka Enberg, Sasha Levin
This commit adds a target for 'lkvm-static' which is linked -static.
(This can be useful to construct kvmtool binaries for minimalist
auto-test host filesystems.)
Since extra features (SDL, AIO, VNC etc.) are auto-detected in the makefile
AND some features may only work when linked one way (but not both), the
feature detection now checks for both dynamic & static success. Intermediate
objects build with correct flags (e.g. CONFIG_HAS_AIO) for the end target.
Signed-off-by: Matt Evans <matt@ozlabs.org>
---
V3: OK, I solved the problem of "probe for dynamic optional lib, fail to
link it statically" with a second set of probes, for static optional libs,
with appropriate dependencies to tie all this back to lkvm-static.
tools/kvm/Makefile | 98 ++++++++++++++++++++++++++++++++++++---------------
1 files changed, 69 insertions(+), 29 deletions(-)
diff --git a/tools/kvm/Makefile b/tools/kvm/Makefile
index ccf10fb..513bb51 100644
--- a/tools/kvm/Makefile
+++ b/tools/kvm/Makefile
@@ -143,52 +143,76 @@ else
UNSUPP_ERR =
endif
+###
+
+# Detect optional features.
+# On a given system, some libs may link statically, some may not; so, check
+# both and only build those that link!
FLAGS_BFD := $(CFLAGS) -lbfd
-has_bfd := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD))
-ifeq ($(has_bfd),y)
- CFLAGS += -DCONFIG_HAS_BFD
- OBJS += symbol.o
- LIBS += -lbfd
+ifeq ($(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD)),y)
+ CFLAGS_DYNOPT += -DCONFIG_HAS_BFD
+ OBJS_DYNOPT += symbol.o
+ LIBS_DYNOPT += -lbfd
+endif
+ifeq ($(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD) -static),y)
+ CFLAGS_STATOPT += -DCONFIG_HAS_BFD
+ OBJS_STATOPT += symbol.o
+ LIBS_STATOPT += -lbfd
endif
FLAGS_VNCSERVER := $(CFLAGS) -lvncserver
-has_vncserver := $(call try-cc,$(SOURCE_VNCSERVER),$(FLAGS_VNCSERVER))
-ifeq ($(has_vncserver),y)
- OBJS += ui/vnc.o
- CFLAGS += -DCONFIG_HAS_VNCSERVER
- LIBS += -lvncserver
+ifeq ($(call try-cc,$(SOURCE_VNCSERVER),$(FLAGS_VNCSERVER)),y)
+ OBJS_DYNOPT += ui/vnc.o
+ CFLAGS_DYNOPT += -DCONFIG_HAS_VNCSERVER
+ LIBS_DYNOPT += -lvncserver
+endif
+ifeq ($(call try-cc,$(SOURCE_VNCSERVER),$(FLAGS_VNCSERVER) -static),y)
+ OBJS_STATOPT += ui/vnc.o
+ CFLAGS_STATOPT += -DCONFIG_HAS_VNCSERVER
+ LIBS_STATOPT += -lvncserver
endif
FLAGS_SDL := $(CFLAGS) -lSDL
-has_SDL := $(call try-cc,$(SOURCE_SDL),$(FLAGS_SDL))
-ifeq ($(has_SDL),y)
- OBJS += ui/sdl.o
- CFLAGS += -DCONFIG_HAS_SDL
- LIBS += -lSDL
+ifeq ($(call try-cc,$(SOURCE_SDL),$(FLAGS_SDL)),y)
+ OBJS_DYNOPT += ui/sdl.o
+ CFLAGS_DYNOPT += -DCONFIG_HAS_SDL
+ LIBS_DYNOPT += -lSDL
+endif
+ifeq ($(call try-cc,$(SOURCE_SDL),$(FLAGS_SDL) -static), y)
+ OBJS_STATOPT += ui/sdl.o
+ CFLAGS_STATOPT += -DCONFIG_HAS_SDL
+ LIBS_STATOPT += -lSDL
endif
FLAGS_ZLIB := $(CFLAGS) -lz
-has_ZLIB := $(call try-cc,$(SOURCE_ZLIB),$(FLAGS_ZLIB))
-ifeq ($(has_ZLIB),y)
- CFLAGS += -DCONFIG_HAS_ZLIB
- LIBS += -lz
+ifeq ($(call try-cc,$(SOURCE_ZLIB),$(FLAGS_ZLIB)),y)
+ CFLAGS_DYNOPT += -DCONFIG_HAS_ZLIB
+ LIBS_DYNOPT += -lz
+endif
+ifeq ($(call try-cc,$(SOURCE_ZLIB),$(FLAGS_ZLIB) -static),y)
+ CFLAGS_STATOPT += -DCONFIG_HAS_ZLIB
+ LIBS_STATOPT += -lz
endif
FLAGS_AIO := $(CFLAGS) -laio
-has_AIO := $(call try-cc,$(SOURCE_AIO),$(FLAGS_AIO))
-ifeq ($(has_AIO),y)
- CFLAGS += -DCONFIG_HAS_AIO
- LIBS += -laio
+ifeq ($(call try-cc,$(SOURCE_AIO),$(FLAGS_AIO)),y)
+ CFLAGS_DYNOPT += -DCONFIG_HAS_AIO
+ LIBS_DYNOPT += -laio
+endif
+ifeq ($(call try-cc,$(SOURCE_AIO),$(FLAGS_AIO) -static),y)
+ CFLAGS_STATOPT += -DCONFIG_HAS_AIO
+ LIBS_STATOPT += -laio
endif
+###
+
LIBS += -lrt
LIBS += -lpthread
LIBS += -lutil
DEPS := $(patsubst %.o,%.d,$(OBJS))
-OBJS += $(OTHEROBJS)
DEFINES += -D_FILE_OFFSET_BITS=64
DEFINES += -D_GNU_SOURCE
@@ -229,9 +253,21 @@ KVMTOOLS-VERSION-FILE:
@$(SHELL_PATH) util/KVMTOOLS-VERSION-GEN $(OUTPUT)
-include $(OUTPUT)KVMTOOLS-VERSION-FILE
-$(PROGRAM): $(DEPS) $(OBJS)
+# When building -static all objects are built with appropriate flags, which
+# may differ between static & dynamic .o. The objects are separated into
+# .o and .static.o. See the %.o: %.c rules below.
+#
+# $(OTHEROBJS) are things that do not get substituted like this.
+#
+STATIC_OBJS = $(patsubst %.o,%.static.o,$(OBJS) $(OBJS_STATOPT))
+
+$(PROGRAM)-static: $(DEPS) $(STATIC_OBJS) $(OTHEROBJS)
+ $(E) " LINK " $@
+ $(Q) $(CC) -static $(CFLAGS) $(STATIC_OBJS) $(OTHEROBJS) $(LIBS) $(LIBS_STATOPT) -o $@
+
+$(PROGRAM): $(DEPS) $(OBJS) $(OBJS_DYNOPT) $(OTHEROBJS)
$(E) " LINK " $@
- $(Q) $(CC) $(CFLAGS) $(OBJS) $(LIBS) -o $@
+ $(Q) $(CC) $(CFLAGS) $(OBJS) $(OBJS_DYNOPT) $(OTHEROBJS) $(LIBS) $(LIBS_DYNOPT) -o $@
$(PROGRAM_ALIAS): $(PROGRAM)
$(E) " LN " $@
@@ -258,13 +294,17 @@ builtin-help.d: $(KVM_INCLUDE)/common-cmds.h
$(OBJS):
-util/rbtree.o: ../../lib/rbtree.c
+util/rbtree.static.o util/rbtree.o: ../../lib/rbtree.c
$(E) " CC " $@
$(Q) $(CC) -c $(CFLAGS) $< -o $@
+%.static.o: %.c
+ $(E) " CC " $@
+ $(Q) $(CC) -c $(CFLAGS) $(CFLAGS_STATOPT) $< -o $@
+
%.o: %.c
$(E) " CC " $@
- $(Q) $(CC) -c $(CFLAGS) $< -o $@
+ $(Q) $(CC) -c $(CFLAGS) $(CFLAGS_DYNOPT) $< -o $@
$(KVM_INCLUDE)/common-cmds.h: util/generate-cmdlist.sh command-list.txt
@@ -325,7 +365,7 @@ clean:
$(Q) rm -f x86/bios/bios-rom.h
$(Q) rm -f tests/boot/boot_test.iso
$(Q) rm -rf tests/boot/rootfs/
- $(Q) rm -f $(DEPS) $(OBJS) $(PROGRAM) $(PROGRAM_ALIAS) $(GUEST_INIT) $(GUEST_INIT_S2)
+ $(Q) rm -f $(DEPS) $(OBJS) $(OTHEROBJS) $(OBJS_DYNOPT) $(STATIC_OBJS) $(PROGRAM) $(PROGRAM_ALIAS) $(PROGRAM)-static $(GUEST_INIT) $(GUEST_INIT_S2)
$(Q) rm -f cscope.*
$(Q) rm -f tags
$(Q) rm -f TAGS
--
1.7.0.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH V3] kvm tools: Add build target for statically-linked binary
2012-02-02 2:47 [PATCH V3] kvm tools: Add build target for statically-linked binary Matt Evans
@ 2012-02-02 3:03 ` Asias He
2012-02-02 6:56 ` Pekka Enberg
0 siblings, 1 reply; 3+ messages in thread
From: Asias He @ 2012-02-02 3:03 UTC (permalink / raw)
To: Matt Evans; +Cc: KVM list, Pekka Enberg, Sasha Levin
On 02/02/2012 10:47 AM, Matt Evans wrote:
> This commit adds a target for 'lkvm-static' which is linked -static.
>
> (This can be useful to construct kvmtool binaries for minimalist
> auto-test host filesystems.)
>
> Since extra features (SDL, AIO, VNC etc.) are auto-detected in the makefile
> AND some features may only work when linked one way (but not both), the
> feature detection now checks for both dynamic & static success. Intermediate
> objects build with correct flags (e.g. CONFIG_HAS_AIO) for the end target.
>
> Signed-off-by: Matt Evans <matt@ozlabs.org>
> ---
>
> V3: OK, I solved the problem of "probe for dynamic optional lib, fail to
> link it statically" with a second set of probes, for static optional libs,
> with appropriate dependencies to tie all this back to lkvm-static.
This version works for me. Thanks Matt!
--
Asias He
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH V3] kvm tools: Add build target for statically-linked binary
2012-02-02 3:03 ` Asias He
@ 2012-02-02 6:56 ` Pekka Enberg
0 siblings, 0 replies; 3+ messages in thread
From: Pekka Enberg @ 2012-02-02 6:56 UTC (permalink / raw)
To: Asias He; +Cc: Matt Evans, KVM list, Sasha Levin
On Thu, Feb 2, 2012 at 5:03 AM, Asias He <asias.hejun@gmail.com> wrote:
> On 02/02/2012 10:47 AM, Matt Evans wrote:
>> This commit adds a target for 'lkvm-static' which is linked -static.
>>
>> (This can be useful to construct kvmtool binaries for minimalist
>> auto-test host filesystems.)
>>
>> Since extra features (SDL, AIO, VNC etc.) are auto-detected in the makefile
>> AND some features may only work when linked one way (but not both), the
>> feature detection now checks for both dynamic & static success. Intermediate
>> objects build with correct flags (e.g. CONFIG_HAS_AIO) for the end target.
>>
>> Signed-off-by: Matt Evans <matt@ozlabs.org>
>> ---
>>
>> V3: OK, I solved the problem of "probe for dynamic optional lib, fail to
>> link it statically" with a second set of probes, for static optional libs,
>> with appropriate dependencies to tie all this back to lkvm-static.
>
>
> This version works for me. Thanks Matt!
Applied, thanks!
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-02-02 6:56 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-02 2:47 [PATCH V3] kvm tools: Add build target for statically-linked binary Matt Evans
2012-02-02 3:03 ` Asias He
2012-02-02 6:56 ` Pekka Enberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox