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可执行文件。