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-y, CFLAGS, 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