mk: combined library
authorIntel <intel.com>
Wed, 18 Sep 2013 10:00:00 +0000 (12:00 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 9 Oct 2013 13:46:49 +0000 (15:46 +0200)
Allow to merge all libraries (shared or static) into one.

Signed-off-by: Intel
config/defconfig_x86_64-default-linuxapp-gcc
mk/rte.app.mk
mk/rte.lib.mk
mk/rte.sdkbuild.mk
mk/rte.sharelib.mk [new file with mode: 0644]
mk/rte.vars.mk

index d134c4e..e29f3bc 100644 (file)
@@ -76,8 +76,14 @@ CONFIG_RTE_FORCE_INTRINSICS=n
 #
 # Compile to share library
 #
+CONFIG_RTE_LIBNAME=intel_dpdk
 CONFIG_RTE_BUILD_SHARED_LIB=n
 
+#
+# Combine to one single library
+#
+CONFIG_RTE_BUILD_COMBINE_LIBS=n
+
 #
 #
 # Compile libc directory
index 449f325..a282ea5 100644 (file)
@@ -162,6 +162,10 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
+ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
+LDLIBS += -l$(RTE_LIBNAME)
+endif
+
 ifeq ($(LINK_USING_CC),1)
 comma := ,
 LDLIBS := $(addprefix -Wl$(comma),$(LDLIBS))
index f56df5c..30136b4 100644 (file)
@@ -76,6 +76,24 @@ O_TO_S_DO = @set -e; \
        $(O_TO_S) && \
        echo $(O_TO_S_CMD) > $(call exe2cmd,$(@))
 
+ifeq ($(RTE_BUILD_SHARED_LIB),n)
+O_TO_C = $(AR) crus $(LIB_ONE) $(OBJS-y)
+O_TO_C_STR = $(subst ','\'',$(O_TO_C)) #'# fix syntax highlight
+O_TO_C_DISP = $(if $(V),"$(O_TO_C_STR)","  AR_C $(@)")
+O_TO_C_DO = @set -e; \
+       $(lib_dir) \
+       $(copy_obj)
+else
+O_TO_C = $(LD) -z muldefs -share $(OBJS-y) -o $(LIB_ONE)
+O_TO_C_STR = $(subst ','\'',$(O_TO_C)) #'# fix syntax highlight
+O_TO_C_DISP = $(if $(V),"$(O_TO_C_STR)","  LD_C $(@)")
+O_TO_C_DO = @set -e; \
+       $(lib_dir) \
+       $(copy_obj)
+endif
+
+copy_obj = cp -f $(OBJS-y) $(RTE_OUTPUT)/build/lib;
+lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 -include .$(LIB).cmd
 
 #
@@ -96,6 +114,14 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
                $(depfile_missing),\
                $(depfile_newer)),\
                $(O_TO_S_DO))
+ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
+       $(if $(or \
+        $(file_missing),\
+        $(call cmdline_changed,$(O_TO_C_STR)),\
+        $(depfile_missing),\
+        $(depfile_newer)),\
+        $(O_TO_C_DO))
+endif
 else
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
        @[ -d $(dir $@) ] || mkdir -p $(dir $@)
@@ -111,6 +137,14 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
            $(depfile_missing),\
            $(depfile_newer)),\
            $(O_TO_A_DO))
+ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
+       $(if $(or \
+        $(file_missing),\
+        $(call cmdline_changed,$(O_TO_C_STR)),\
+        $(depfile_missing),\
+        $(depfile_newer)),\
+        $(O_TO_C_DO))
+endif
 endif
 
 #
index f58b15f..f4dc405 100644 (file)
@@ -77,6 +77,9 @@ $(ROOTDIRS-y):
        @[ -d $(BUILDDIR)/$@ ] || mkdir -p $(BUILDDIR)/$@
        @echo "== Build $@"
        $(Q)$(MAKE) S=$@ -f $(RTE_SRCDIR)/$@/Makefile -C $(BUILDDIR)/$@ all
+       @if [ $@ = lib -a $(RTE_BUILD_COMBINE_LIBS) = y ]; then \
+               $(MAKE) -f $(RTE_SDK)/lib/Makefile sharelib; \
+       fi
 
 %_clean:
        @echo "== Clean $*"
diff --git a/mk/rte.sharelib.mk b/mk/rte.sharelib.mk
new file mode 100644 (file)
index 0000000..503f7b8
--- /dev/null
@@ -0,0 +1,90 @@
+#   BSD LICENSE
+# 
+#   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
+#   All rights reserved.
+# 
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# VPATH contains at least SRCDIR
+VPATH += $(SRCDIR)
+
+ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+LIB_ONE := lib$(RTE_LIBNAME).so
+else
+LIB_ONE := lib$(RTE_LIBNAME).a
+endif
+endif
+
+.PHONY:sharelib
+sharelib: $(LIB_ONE) FORCE
+
+OBJS = $(wildcard $(RTE_OUTPUT)/build/lib/*.o)
+
+O_TO_S = $(LD) $(CPU_LDFLAGS) -share $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
+O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
+O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)","  LD $(@)")
+O_TO_S_CMD = "cmd_$@ = $(O_TO_S_STR)"
+O_TO_S_DO = @set -e; \
+    echo $(O_TO_S_DISP); \
+    $(O_TO_S)
+
+O_TO_A =  $(AR) crus $(RTE_OUTPUT)/lib/$(LIB_ONE) $(OBJS)
+O_TO_A_STR = $(subst ','\'',$(O_TO_A)) #'# fix syntax highlight
+O_TO_A_DISP = $(if $(V),"$(O_TO_A_STR)","  LD $(@)")
+O_TO_A_CMD = "cmd_$@ = $(O_TO_A_STR)"
+O_TO_A_DO = @set -e; \
+    echo $(O_TO_A_DISP); \
+    $(O_TO_A)
+#
+# Archive objects to share library
+#
+
+ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+$(LIB_ONE): FORCE
+       @[ -d $(dir $@) ] || mkdir -p $(dir $@)
+       $(O_TO_S_DO)
+else
+$(LIB_ONE): FORCE
+       @[ -d $(dir $@) ] || mkdir -p $(dir $@)
+       $(O_TO_A_DO)
+endif
+endif
+
+#
+# Clean all generated files
+#
+.PHONY: clean
+clean: _postclean
+
+.PHONY: doclean
+doclean:
+       $(Q)rm -rf $(LIB_ONE)
+
+.PHONY: FORCE
+FORCE:
index 801b585..c517dd0 100644 (file)
@@ -64,9 +64,17 @@ ifneq ($(BUILDING_RTE_SDK),)
   RTE_TARGET := $(RTE_ARCH)-$(RTE_MACHINE)-$(RTE_EXEC_ENV)-$(RTE_TOOLCHAIN)
   RTE_SDK_BIN := $(RTE_OUTPUT)
   RTE_BUILD_SHARED_LIB := $(CONFIG_RTE_BUILD_SHARED_LIB:"%"=%)
+  RTE_LIBNAME := $(CONFIG_RTE_LIBNAME:"%s"=%)
+  ifeq ($(RTE_LIBNAME),)
+    RTE_LIBNAME := intel_dpdk
+  endif
   ifeq ($(RTE_BUILD_SHARED_LIB),)
     RTE_BUILD_SHARED_LIB := n
   endif
+  RTE_BUILD_COMBINE_LIBS := $(CONFIG_RTE_BUILD_COMBINE_LIBS:"%"=%)
+  ifeq ($(RTE_BUILD_COMBINE_LIBS),)
+    RTE_BUILD_COMBINE_LIBS := n
+  endif
 endif
 
 # RTE_TARGET is deducted from config when we are building the SDK.