DPDK的示例程序Makefile

以helloworld为例,其makefile位于目录: dpdk-19.02/examples/helloworld/Makefile。 文件中真正必须的为两个变量APP和SRCS-y,前者为示例程序编译生成的目标文件名称,后者为要编译的源文件,helloworld程序仅有一个main.c文件。

# binary name
APP = helloworld

# all source are stored in SRCS-y
SRCS-y := main.c

include $(RTE_SDK)/mk/rte.vars.mk

CFLAGS += -O3
CFLAGS += $(WERROR_FLAGS)

include $(RTE_SDK)/mk/rte.extapp.mk

另外两个必须的为makefile文件rte.vars.mk和rte.extapp.mk。前者定义一些全局的编译打包链接用到的选项,如CFLAGS、ASFLAGS、LDFLAGS等变量,头文件位置和库路径等和体系架构相关编译选项。后者rte.extapp.mk内部又包含了重要的mk/rte.app.mk文件,首先变量LDLIBS初始化为DPDK核心编译生成的所有静态库文件。

_LDLIBS-$(CONFIG_RTE_LIBRTE_FLOW_CLASSIFY)  += -lrte_flow_classify
_LDLIBS-$(CONFIG_RTE_LIBRTE_PIPELINE)       += --whole-archive

_LDLIBS-y += $(EXECENV_LDLIBS)

LDLIBS += $(_LDLIBS-y) $(CPU_LDLIBS) $(EXTRA_LDLIBS)

LDLIBS包括的是目录dpdk-19.02/build/lib的所有库文件:

$ ls dpdk-19.02/build/lib/    
libdpdk.a                 librte_kni.a                   librte_pmd_cxgbe.a            librte_pmd_octeontx_zip.a
librte_acl.a              librte_kvargs.a                librte_pmd_dpaa2.a            librte_pmd_opdl_event.a

Makefile文件rte.app.mk的编译命令如下,变量O_TO_EXE的内容为具体的编译命令。编译时看到的为变量O_TO_EXE_DO执行的结果,如echo语句将显示变量O_TO_EXE_DISP的内容,以helloworld为例其显示为:LD helloworld。

ifeq ($(LINK_USING_CC),1)
O_TO_EXE = $(CC) -o $@ $(CFLAGS) $(EXTRA_CFLAGS) $(OBJS-y) $(call linkerprefix, \
    $(LDLIBS) $(LDFLAGS) $(LDFLAGS_$(@)) $(EXTRA_LDFLAGS) \
    $(MAPFLAGS))
else
O_TO_EXE = $(LD) -o $@ $(OBJS-y) \
    $(LDLIBS) $(LDFLAGS) $(LDFLAGS_$(@)) $(EXTRA_LDFLAGS) \
    $(MAPFLAGS)
endif
O_TO_EXE_STR = $(subst ','\'',$(O_TO_EXE)) #'# fix syntax highlight
O_TO_EXE_DISP = $(if $(V),"$(O_TO_EXE_STR)","  LD $(@)")
O_TO_EXE_CMD = "cmd_$@ = $(O_TO_EXE_STR)"
O_TO_EXE_DO = @set -e; \
    echo $(O_TO_EXE_DISP); \
    $(O_TO_EXE) && \
    echo $(O_TO_EXE_CMD) > $(call exe2cmd,$(@))

文件rte.app.mk中的安装命令install,由如下的makefile目标实现,即显示INSTALL加正在编译的示例名称,将其拷贝的示例程序所在目录的build/app目录下。

$(RTE_OUTPUT)/app/$(APP): $(APP)
    @echo "  INSTALL-APP $(APP)"
    @[ -d $(RTE_OUTPUT)/app ] || mkdir -p $(RTE_OUTPUT)/app
    $(Q)cp -f $(APP) $(RTE_OUTPUT)/app
	
$(RTE_OUTPUT)/app/$(APP).map: $(APP)
    @echo "  INSTALL-MAP $(APP).map"
    @[ -d $(RTE_OUTPUT)/app ] || mkdir -p $(RTE_OUTPUT)/app
    $(Q)cp -f $(APP).map $(RTE_OUTPUT)/app

对于helloworld程序,显示INSTALL-APP helloworld。示例程序编译完成之后,安装目录内容如下:

$ ls dpdk-19.02/examples/helloworld/build/app/
helloworld  helloworld.map

 

End

 

你可能感兴趣的:(DPDK)