searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

bio驱动编译过程分析

2023-12-11 02:49:40
18
0

bio_driver的编译过程:

由于bio_driver是spdk的一个app应用组件,所以我们先编译spdk。

我们们的目录级别截图如下:

先进入spdk目录:

执行./configure --disable-unit-tests --disable-tests 进行初始化的宏定义配置,可以根据实际需要增加--with-rbd --with-fio=/*dir等。

完成后生成mk/config.mk文件

config.mk文件中是控制编译的时候编译哪些文件的宏定义信息:

部分配置信息如下:
# Build Ceph RBD support in bdev modules
# Requires librbd development libraries
CONFIG_RBD?=n

# Build vhost library.
CONFIG_VHOST?=y

# Build vhost initiator (Virtio) driver.
CONFIG_VIRTIO?=y

 

之后我们执行make 命令,执行/spdk/makefile文件。

默认编译的主目标是all:

all: mk/cc.mk $(DIRS-y)
clean: $(DIRS-y)
        $(Q)rm -f include/spdk/config.h
        $(Q)rm -rf build

install: all
        $(Q)echo "Installed to $(DESTDIR)$(CONFIG_PREFIX)"

uninstall: $(DIRS-y)
        $(Q)echo "Uninstalled spdk"

cc.mk中定义了使用的基本工具

 

$(DIRS-y)的依赖关系如下:

先执行依赖的目标内容,然后再执行$(DIRS-y)

$(DIRS-y): mk/cc.mk build_dir include/spdk/config.h

mk/cc.mk:
        $(Q)echo "Please run configure prior to make"
        false

build_dir: mk/cc.mk
        $(Q)mkdir -p build/lib/pkgconfig/tmp
        $(Q)mkdir -p build/bin
        $(Q)mkdir -p build/fio
        $(Q)mkdir -p build/examples
        $(Q)mkdir -p build/include/spdk

include/spdk/config.h: mk/config.mk scripts/genconfig.py
        $(Q)echo "#ifndef SPDK_CONFIG_H" > $@.tmp; \
        echo "#define SPDK_CONFIG_H" >> $@.tmp; \
        scripts/genconfig.py $(MAKEFLAGS) >> $@.tmp; \
        echo "#endif /* SPDK_CONFIG_H */" >> $@.tmp; \
        cmp -s $@.tmp $@ || mv $@.tmp $@ ; \
        rm -f $@.tmp

 

根Makefile最后包含了include $(SPDK_ROOT_DIR)/mk/spdk.subdirs.mk

$(DIRS-y)定义在spdk.subdirs.mk中。

在spdk.subdirs.mk中

ALL_DEPDIRS := $(patsubst DEPDIRS-%,%,$(filter DEPDIRS-%,$(.VARIABLES)))

define depdirs_rule
$(DEPDIRS-$(1)):

$(1): | $(DEPDIRS-$(1))

endef

$(DIRS-y) :
        $(Q)$(MAKE) -C $@ S=$S$(S:%=/)$@ $(MAKECMDGOALS)

$(foreach dir,$(ALL_DEPDIRS),$(eval $(call depdirs_rule,$(dir))))

install: all $(DIRS-y)

uninstall: $(DIRS-y)

递归编译各个子目录中的源文件

 

在每个模块的makefile中最后包含了

include $(SPDK_ROOT_DIR)/mk/spdk.lib.mk

目标的依赖:

all: $(BUILD_DEP)
        @:

 78 ifneq ($(DIRS-y),)
 79 BUILD_DEP := $(DIRS-y)
 80 else
 81 BUILD_DEP := $(DEP)
 82 endif

 

DEP根据是编译共享库还是静态库来执行对应的目标:

 59 ifeq ($(CONFIG_SHARED),y)
 60 DEP := $(SHARED_LINKED_LIB)
 61 else
 62 DEP := $(LIB)
 63 endif
 64 
 65 DEP += $(PKGCONFIG) ${PKGCONFIG_INST}

 

以静态库为例:

找到LIB_C目标进行编译

129 $(LIB): $(OBJS)
130         $(LIB_C)

在spdk.common.mk中定义了此目标:

364 LIB_C=\
365         $(Q)echo "  LIB $(notdir $@)"; \
366         rm -f $@; \
367         mkdir -p $(dir $@); \
368         $(CCAR) crDs $@ $(OBJS)

根据依赖的OBJS文件,生成对应具体的lib文件。

 

在lib的mk中根据lib依赖的其他lib和module再一次调用其他的mk文件,最终生成需要的lib信息。

 

 

spdk编译完成后,需要编译对应的app。

我们这里使用的是bio_driver对应的app。

bio_make.sh

里面先清理之前编译的数据内容,然后开始编译对应的文件:

关键编译路径:

# run_test external_make_bsc_static make -C /home/secure/jiaguodong/windows_code/code/soc_storage_service/driver blk_net_static_combo

进入到对应的路径,编译指定目标:

make --directory=bio_tgt blk_net_static_combo

根据依赖关系依次编译:

make -C management all

make -C apilib all;

make -C reglib all;

 

根据编译的目标blk_net_static_combo,

使用已经编译好的.o文件生成对应的bio_tgt可执行文件。

 

 

0条评论
0 / 1000
j****n
2文章数
0粉丝数
j****n
2 文章 | 0 粉丝