1# Common Makefile for building a lib. 2# 3# Variables taken as input: 4# PKG_CONFIG_FILE: name of pkg-config file (xen$(LIBNAME).pc if empty) 5# MAJOR: major version of lib (Xen version if empty) 6# MINOR: minor version of lib (0 if empty) 7# version-script: Specify the name of a version script to the linker. 8# (If empty, a temporary one for unstable library is created) 9 10LIBNAME := $(notdir $(CURDIR)) 11 12ifeq ($(origin MAJOR), undefined) 13MAJOR := $(shell $(XEN_ROOT)/version.sh $(XEN_ROOT)/xen/Makefile) 14endif 15MINOR ?= 0 16 17CFLAGS += -Wmissing-prototypes 18CFLAGS += $(CFLAGS_xeninclude) 19CFLAGS += $(foreach lib, $(USELIBS_$(LIBNAME)), $(CFLAGS_libxen$(lib))) 20 21LDLIBS += $(call xenlibs-ldlibs,$(USELIBS_$(LIBNAME))) 22 23PIC_OBJS := $(OBJS-y:.o=.opic) 24 25LIB_FILE_NAME = $(FILENAME_$(LIBNAME)) 26TARGETS := lib$(LIB_FILE_NAME).a 27ifneq ($(nosharedlibs),y) 28TARGETS += lib$(LIB_FILE_NAME).so 29endif 30 31version-script ?= lib$(LIB_FILE_NAME).map.tmp 32 33PKG_CONFIG_FILE ?= $(LIB_FILE_NAME).pc 34PKG_CONFIG_NAME ?= Xen$(LIBNAME) 35PKG_CONFIG_DESC ?= The $(PKG_CONFIG_NAME) library for Xen hypervisor 36PKG_CONFIG_VERSION := $(MAJOR).$(MINOR) 37PKG_CONFIG_USELIBS := $(SHLIB_libxen$(LIBNAME)) 38PKG_CONFIG_LIB := $(LIB_FILE_NAME) 39PKG_CONFIG_REQPRIV := $(subst $(space),$(comma),$(strip $(foreach lib,$(patsubst ctrl,control,$(USELIBS_$(LIBNAME))),xen$(lib)))) 40 41ifneq ($(CONFIG_LIBXC_MINIOS),y) 42TARGETS += $(PKG_CONFIG_FILE) 43$(PKG_CONFIG_FILE): PKG_CONFIG_PREFIX = $(prefix) 44$(PKG_CONFIG_FILE): PKG_CONFIG_INCDIR = $(includedir) 45$(PKG_CONFIG_FILE): PKG_CONFIG_LIBDIR = $(libdir) 46endif 47 48PKG_CONFIG_LOCAL := $(PKG_CONFIG_DIR)/$(PKG_CONFIG_FILE) 49 50LIBHEADER ?= $(LIB_FILE_NAME).h 51LIBHEADERS = $(foreach h, $(LIBHEADER), $(XEN_INCLUDE)/$(h)) 52 53PKG_ABI := lib$(LIB_FILE_NAME).so.$(MAJOR).$(MINOR)-$(XEN_TARGET_ARCH)-abi.dump 54 55$(PKG_CONFIG_LOCAL): PKG_CONFIG_PREFIX = $(XEN_ROOT) 56$(PKG_CONFIG_LOCAL): PKG_CONFIG_INCDIR = $(XEN_INCLUDE) 57$(PKG_CONFIG_LOCAL): PKG_CONFIG_LIBDIR = $(CURDIR) 58 59.PHONY: all 60all: $(TARGETS) $(PKG_CONFIG_LOCAL) $(LIBHEADERS) 61 62ifneq ($(NO_HEADERS_CHK),y) 63all: headers.chk 64 65headers.chk: $(LIBHEADERS) $(AUTOINCS) 66 for i in $(filter %.h,$^); do \ 67 $(CC) -x c -ansi -Wall -Werror $(CFLAGS_xeninclude) \ 68 -S -o /dev/null $$i || exit 1; \ 69 echo $$i; \ 70 done >$@.new 71 mv $@.new $@ 72endif 73 74headers.lst: FORCE 75 @{ set -e; $(foreach h,$(LIBHEADERS),echo $(h);) } > $@.tmp 76 @$(call move-if-changed,$@.tmp,$@) 77 78lib$(LIB_FILE_NAME).map.tmp: FORCE 79 echo 'lib$(LIB_FILE_NAME)_$(MAJOR).$(MINOR) { global: *; };' >$(@D)/.$(@F) 80 $(call move-if-changed,$(@D)/.$(@F),$@) 81 82lib$(LIB_FILE_NAME).a: $(OBJS-y) 83 $(AR) rc $@ $^ 84 85lib$(LIB_FILE_NAME).so: lib$(LIB_FILE_NAME).so.$(MAJOR) 86 $(SYMLINK_SHLIB) $< $@ 87lib$(LIB_FILE_NAME).so.$(MAJOR): lib$(LIB_FILE_NAME).so.$(MAJOR).$(MINOR) 88 $(SYMLINK_SHLIB) $< $@ 89 90lib$(LIB_FILE_NAME).so.$(MAJOR).$(MINOR): $(PIC_OBJS) $(version-script) 91 $(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,lib$(LIB_FILE_NAME).so.$(MAJOR) -Wl,--version-script=$(version-script) $(SHLIB_LDFLAGS) -o $@ $(PIC_OBJS) $(LDLIBS) $(APPEND_LDFLAGS) 92 93# If abi-dumper is available, write out the ABI analysis 94ifneq ($(ABI_DUMPER),) 95ifneq ($(nosharedlibs),y) 96all: $(PKG_ABI) 97$(PKG_ABI): lib$(LIB_FILE_NAME).so.$(MAJOR).$(MINOR) headers.lst 98 $(ABI_DUMPER) $< -o $@ -public-headers headers.lst -lver $(MAJOR).$(MINOR) 99endif 100endif 101 102.PHONY: install 103install:: all 104 $(INSTALL_DIR) $(DESTDIR)$(libdir) 105 $(INSTALL_DIR) $(DESTDIR)$(includedir) 106 $(INSTALL_SHLIB) lib$(LIB_FILE_NAME).so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir) 107 $(INSTALL_DATA) lib$(LIB_FILE_NAME).a $(DESTDIR)$(libdir) 108 $(SYMLINK_SHLIB) lib$(LIB_FILE_NAME).so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/lib$(LIB_FILE_NAME).so.$(MAJOR) 109 $(SYMLINK_SHLIB) lib$(LIB_FILE_NAME).so.$(MAJOR) $(DESTDIR)$(libdir)/lib$(LIB_FILE_NAME).so 110 for i in $(LIBHEADERS); do $(INSTALL_DATA) $$i $(DESTDIR)$(includedir); done 111 $(INSTALL_DATA) $(PKG_CONFIG_FILE) $(DESTDIR)$(PKG_INSTALLDIR) 112 113.PHONY: uninstall 114uninstall:: 115 rm -f $(DESTDIR)$(PKG_INSTALLDIR)/$(LIB_FILE_NAME).pc 116 for i in $(LIBHEADER); do rm -f $(DESTDIR)$(includedir)/$$i; done 117 rm -f $(DESTDIR)$(libdir)/lib$(LIB_FILE_NAME).so 118 rm -f $(DESTDIR)$(libdir)/lib$(LIB_FILE_NAME).so.$(MAJOR) 119 rm -f $(DESTDIR)$(libdir)/lib$(LIB_FILE_NAME).so.$(MAJOR).$(MINOR) 120 rm -f $(DESTDIR)$(libdir)/lib$(LIB_FILE_NAME).a 121 122.PHONY: TAGS 123TAGS: 124 etags -t *.c *.h 125 126.PHONY: clean 127clean:: 128 rm -rf $(TARGETS) *~ $(DEPS_RM) $(OBJS-y) $(PIC_OBJS) 129 rm -f lib$(LIB_FILE_NAME).so.$(MAJOR).$(MINOR) lib$(LIB_FILE_NAME).so.$(MAJOR) 130 rm -f headers.chk headers.lst lib*.map.tmp .*.tmp 131 132.PHONY: distclean 133distclean: clean 134 135ifeq ($(filter clean distclean,$(MAKECMDGOALS)),) 136-include $(DEPS_INCLUDE) 137endif 138