DPDK2.2.0开发杂记四—— DPDK编译架构的集成

       DPDK有自己的一套编译架构,进行DPDK应用开发时,为了保证与DPDK库保持相同的编译选项及编译预置常量,我们需要融合DPDK的编译架构编写应用的Makefile 文件。以下为我开发过程中总结的一些点:

1. 需要设置环境变量RTE_SDK,使编译脚本能够找到DPDK链接库

        设置环境变量有两种方式:

        a) 使用export命令可以查看或设置环境变量,设置方式:export RTE_SDK="/home/dpdk-2.2.0"。不带参数即为查询。这种方式只对当前ssh连接有效,重新打开一个连接则需要重新设置。

        b)编辑文件/etc/environment加入一行 export RTE_SDK="/home/dpdk-2.2.0", 这种方式全局有效,Linux每次重启都会执行这个脚本,对所有用户有效。


2. Makefile文件结构

############################################################

                 DPDK PART

###########################################################

#检查环境变量是否已经设置,没有设置报错并退出

ifeq ($(RTE_SDK),)
$(error "Please define RTE_SDK environment variable")
endif

#指定DPDK编译链接的目标库

# Default target, can be overriden by command line or environment
RTE_TARGET ?= x86_64-native-linuxapp-gcc


#导入DPDK的编译变量,包括SRCS-yCFLAGS, LDLIBS

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


#################### Source List ####################

#列出所有要编译的c文件, 注意没有列出的不编译

SRCS-y = client.c
SRCS-y += util.c
SRCS-y += main.c

#################### Source Path ####################

#列出所有要编译路径, 编译器会在这些路径下找c文件,注意这里开始不能直接赋值,DPDK已经有一些预置的路径,这里需要追加应用自己的路径。

VPATH += $(FRAMEWORK_SRC_EXTERN_DIR)/native/main/
VPATH += $(FRAMEWORK_SRC_EXTERN_DIR)/native/lib/


#################### Compile Option ##################

#列出所有编译选项,头文件路径,预置宏定义等。同样注意这里开始不能直接赋值,DPDK已经有一些预置的编译选项,这里需要追加应用自己的内容即可。

CFLAGS +=  -m64 $(DEBUG_FLAGS) $(INCPATH) $(DEFINES)
CFLAGS += $(WERROR_FLAGS)

#################### Lib Link ########################

#列出所有需要的链接库。同样注意这里开始不能直接赋值,DPDK已经有一些预置的链接库,这里需要追加应用自己的内容即可。

LDLIBS += $(SYSLIBS) $(USERLIBS)


#################### Build ###########################

#在程序编译前和编译后可定制一些操作。这里不是必须的

PREBUILD += BUILD_PRE

POSTBUILD += BUILD_FINISH

#################### Install #########################

#在程序安装(make install)后可定制一些操作。这里不是必须的

#POSTINSTALL += INSTALL_CHECK INSTALL_EXECUTE


#################### Clean ###########################

#在清除操作(make clean)后可定制一些操作。这里不是必须的

POSTCLEAN += CLEAN_EXECUTE


# Binary name

#定义编译最终的二进制文件的名字

APP = app-name


#导入编译app的脚本

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

#定义编译前的一些操作,此处可以动态生成C文件等
.PHONY:BUILD_PRE
BUILD_PRE:
    @if test -f $(VERSION_SRC);then rm -f $(VERSION_SRC);fi    
    @if test -f ./$(notdir $(VERSION_SRC));then rm -f ./$(notdir $(VERSION_SRC));fi    


#定义编译后的一些操作,此处可以回显一些编译结果

.PHONY:BUILD_FINISH
BUILD_FINISH:
    @cp -f $(APP) $(BINPATH)/$(APP)
    @echo "  \>\>\> $(APP) built successfully !!"
ifdef PKG_BUILD_INFO
    @chmod 755 $(SOURCE_SCRIPT_DIR)/pkgmk.sh
    @$(SOURCE_SCRIPT_DIR)/pkgmk.sh x64 V3 V3.4.6 $(COVERFLG)
else
    @echo "  \>\>\> Packet is not gerenated as no packet info defined!!"
endif


#动态生成C文件

# Version
.PHONY:$(notdir $(VERSION_SRC))
$(notdir $(VERSION_SRC)):
    @if test -f $(VERSION_SRC);then rm -f $(VERSION_SRC);fi    
    @if test -f ./$@;then rm -f ./$@;fi    
    @echo "char g_ac_date[]=\"`date`\";"        >>  $(VERSION_SRC)
    @echo "char g_ac_os[]=\"`uname`\";"        >>  $(VERSION_SRC)
    @echo "char g_ac_platform[]=\"`uname -p`\";"        >>  $(VERSION_SRC)
    @echo "char g_ac_machine[]=\"`uname -n`\";"        >>  $(VERSION_SRC)
    @echo "char g_ac_built_by[]=\"`id`\";"      >>  $(VERSION_SRC)
    @echo "char g_ac_built_info[]=\"$(PKG_BUILD_INFO)\";" >> $(VERSION_SRC)
    @echo "char g_ac_bit[]={0};"        >>  $(VERSION_SRC)
    @cp $(VERSION_SRC) ./$@
    @echo "  $@ is constructed successful"


# Install check

#定义安装后的一些操作

.PHONY:INSTALL_CHECK
INSTALL_CHECK:
    @echo checking if APP_HOME has been defined...
    @if test -n "$(APP_HOME)";then     echo ok;else     echo "APP_HOME does not exist!";false;fi
    @if [ $(PROFILE_EXIST) = "nok" ]; then     echo "$(USER)'s profile must be set at first !"; false; else     echo "check \"$(PROFILE_EXIST)\" ok !"; fi


INSTALL_CMD=/usr/bin/install
#定义安装操作
# Install execute
.PHONY:INSTALL_EXECUTE
INSTALL_EXECUTE:
    ${INSTALL_CMD} -d ${BINDIR}
    ${INSTALL_CMD} -d ${SBINDIR}
    ${INSTALL_CMD} -d ${CFGDIR}
    ${INSTALL_CMD} -d ${LOGDIR}
    ${INSTALL_CMD} -d ${TRAFDIR}
    ${INSTALL_CMD} -d ${TMPDIR}
    chmod 775 $(BASE_DIR)/build/bin/renamesh.sh
    ${INSTALL_CMD} -t ${SBINDIR} -m 775  ${TARGET}
    @echo apa installed succesfully!


# Clean execute

#定义Clean操作

.PHONY:CLEAN_EXECUTE
CLEAN_EXECUTE:
    @rm -rf *.i
    @rm -rf *.s
    @rm -rf $(TARGET)
3. 多个可执行文件情况

目前在DPDK编译架构,没有找到一个脚本实现多个可执行文件的方法,我现在是生成多个如上结构的makefile文件,多次build实现多个可执行文件的生成。


版权声明:本文为博主原创文章,承蒙转载请注明作者和出处https://blog.csdn.net/zangchang/article/details/80110239


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值