构建实施
构建系统包括一组相互连接的文件:
- 顶层makefile
- include/settings.makefile
- include/rules.makefile
顶层makefile
- 顶层makefile负责启动构建。
- 顶层makefile(包含级联文件),通过所有产品的源代码树运行(使用级联包含技术),并收集其他级联和项目makefile,将所有组件和示例项目属性传递到make系统中。
- 顶层makefile包括
include/rules.makefile
指示make程序如何构建所有产品文件和所有必要的中间文件,并为启动构建过程的make
命令生成顶级目标。
settings.makefile
include/settings.makefile
文件中包含构建系统的所有启动设置和所需的自动检测探索(auto-detection heuristic)。用户可以在调优后覆盖这些设置。
所有其他子目录makefile都是必需的,以便能够启动该子目录和下游目录的构建过程。子目录makefiles定义了当前目录和顶级目录,并包含了顶层makefile。这使构建系统不仅能够检查当前目录中的文件,而且在必要时还能够重新构建另一个并行目录中的文件,以便在修改一个或多个组件时保持构建过程的正确性。
自动检测探索
include/settings.makefile
中自动检测探索(auto-detection heuristic)将执行以下操作:
- 检测构建平台环境:硬件架构和操作系统。
- 根据构建系统,设置构建过程中使用的应用(如echo、copy、make等)。
- 设置构建系统的编译器系列。如果没有以命令行选项
HOST_COMPILER_FAMILY
和TARGET_COMPILER_FAMILY
的形式覆盖,则主机端和目标端都会设置相同的编译器系列(请参阅“生成系统覆盖”)。 - 使用编译器系列脚本检测主机端和目标端系统的硬件和操作系统。
- 定义SmartEDB组件的默认设置,如:默认内存驱动程序、同步原语包装器、文件系统驱动程序等。
- 根据项目属性定义用于编译和链接的库和功能转换器。例如,需要链接到程序中以支持SQL功能的库等。
- 最后,脚本检查是否存在第三方应用,并决定是否可以使用现有的安装,或者是否需要构建自己的安装。(请参阅”测试和决策程序“)
rules.makefile
include/rules.makefilee
文件中包含依赖关系生成代码。此代码使用级联子系统收集的项目属性为make程序创建依赖树。
提示
每个项目都有一个唯一的名称和与该名称关联的一组属性。
所有项目属性都使用make变量定义。
例如:PRJ_P_NAME_XXXX:=YYYY
,其中_P_NAME_
是项目名词,XXXX
是属性标识符,YYYY
是值。
此外,还有几个名为“lists”的特殊变量,其中包含作为引用的项目名称。
项目需要链接到MCO_PRJ_LIST
列表中(即其名称需要添加为MCO_PRR_LIST+=_P_NAME_
),并至少链接到以下列表之一中:
PRJ_HOST_EXECUTABLE
:主机端系统的可执行文件列表,包括mcocomp
、sql2mco
等。、PRJ_TARGET_EXECUTABLE_DPTR
:为运行时的DPTR
变量构建的目标端的可执行文件列表。PRJ_TARGET_EXECUTABLE_OFFS
:为运行时的OFFS
变量构建的目标端的可执行文件列表。PRJ_TARGET_LIBRARY_DPTR_STATIC
:产品的静态DPTR
库。PRJ_TARGET_LIBRARY_DPTR_DYNAMIC
:产品的动态DPTR
库。PRJ_TARGET_LIBRARY_OFFS_STATIC
:产品的静态OFFS
库。PRJ_TARGET_LIBRARY_OFFS_DYNAMIC
:产品的动态OFFS
库。PRJ_TARGET_JAR
:产品的JARs列表。PRJ_TARGET_CLASS
:产品的Java程序列表。PRJ_CUSTOM
:产品构建需要的第三方组件列表。
提示
一个项目可以添加到多个适合的PRJ_
列表中(例如,C/C++项目适用于库和可执行文件,Java项目适用于类和jar)。
例如,mcovtmem
项目仅包含在PRJ_TARGET_LIBRARY_DPTR_STATIC
和PRJ_TARGET_LIBRARY_DPTR_DYNAMIC
列表中,而mcovtdsk
库存在于所有四个PRJ_TARGET_LIBRARY_*
列表中。构建系统根据这些列表为每个项目设置定制化的构建过程。
构建脚本使用MCO_PRJ_LIST
列表维护全局make指令。例如:
build-all
通过命令行make all
运行,并生成所有产品二进制文件。clean-all
t通过命令行make clean运行,并删除所有中间文件,但保留最终的二进制文件和构建日志。make distclean
命令行可以清除所有内容。- 使用
make <filename>
命令行分别构建每个二进制文件(可执行文件、库、类和jar),如make /home/user/SmartEDB/target/bin/08-benchmarks-perf
。
重要
构建系统使用完整文件名来避免并行构建中的歧义问题。
通过基于标签的过滤器,构建系统允许用户在过程中包含或排除SmartEDB组件。每个项目为组件定义一组标签MCO_ENABLE
和MCO\_DISABLE
(请参阅下面的"make系统控制"),用于启用/禁用目标组件。这不仅将组件命名排除在构建过程之外,而且使所有组件更新其他组件的启用/禁用状态。
例如,MCO_DISABLE=openssl
将从构建过程中排除OpenSSL,并在其他程序中移除引用,如加密驱动程序和OpenSSL特定示例中。
makefile.test
兼容性说明
构建系统包括对测试组run.py
脚本的兼容性支持。
警告
makefile.test
不适合并行处理,强烈不推荐使用make -j
。
以下有两种使用run.py
构建系统的方法。
示例1
以项目makefile方式直接运行makefile.test
MCO_ROOT=$(abspath ../../..)
include $(MCO_ROOT)/include/settings.makefile
TEST_TAGS = disk in-memory callback threads
TEST_COMMENT = Allocation callback test. It checks callback
notification about exceded in-mamory or disk database space
TEST_TIMEOUT = 300
MCO_ROOT ?= ../../..
PRJ_TYPE = APP
PRJ_SHOW_BUILD = YES
PRJ_SIDE = TARGET
PRJ_SOURCES = main.c
PRJ_SCHEMAS = schema.mco
PRJ_INTERFACES =
PRJ_DBNAMES = allocclbkdb
PRJ_STORAGE ?= MEMORY
PRJ_MEMDEV ?= CONV
PRJ_STORAGEDEV = AUTO
PRJ_SYNC = AUTO
PRJ_TRANSMGR ?= MURSIW
PRJ_DIRECTPTR ?= NO
PRJ_HA ?= NONE
PRJ_RPC = NONE
PRJ_F_CPP = NO
PRJ_F_SQL = NO
PRJ_F_LOG = NO
PRJ_F_DBCALC = NO
PRJ_F_UDA = NO
PRJ_F_XML = NO
PRJ_F_SERI = NO
PRJ_F_HV = NO
PRJ_F_CLUSTER = NO
PRJ_RMFILES =
PRJ_TITLE = allocclbk_$(PRJ_SUFFIX)
THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST))
# include $(MCO_ROOT)/include/header.mak
include $(MCO_ROOT)/include/rules.makefile
构建系统通过PTR_TYPE=APP
和TEST_NAME
的存在来检测这种makefile.test
文件。对于这种makefile.test
,构建系统使用PRJ_TITLE
作为项目名称。创建一个虚拟项目生成文件,并将所有构建属性设置为PRJ$(PRJ_TITLE)XXXX
,其中XXXX是属性名称。项目标签来自TEST_TAGS
变量。SmartEDB运行时始终处于启用状态。最终的可执行文件名被设置为PRJ_TITLE
的值,因为该值已经包含PRJ_SUFFIX
。PRJ_DIRECTPTR
控制是否包含在PRJ_TARGET_EXECUTABLE_
-列表中。所有其他构建属性都是根据旧构建系统的规则设置的。
示例2
在makefile.test
下运行构建系统makefile。
TEST_NAME = 08-benchmarks-perf-conv
TEST_TAGS = samples fast perf
TEST_COMMENT = 08-benchmarks perf sample
TEST_TIMEOUT = 300
TEST_STORAGE = MEMORY
MCO_ROOT ?= ../../../../..
all:
$(MAKE) -C . $(MAKEFLAGS) $(MAKECMDGOALS) PRJ_TITLE=$(TEST_NAME)_$(PRJ_SUFFIX)
clean:
$(MAKE) -C . $(MAKEFLAGS) $(MAKECMDGOALS)
构建系统通过变量PRJ_TYPE
和TEST_NAME
来检测makefile.test
。
makefile.test
实际运行的是一个makefile,不需要创建虚拟项目。所有构建属性都来自makefile,脚本将重写PRJ_STORAGE
、PRJ_MEMDEV
、PRJ_TRANSMGR
、PRJ_DIRECTPTR
、PRJ_SUFFIX
和TEST_TAGS
。
PRJ_DIRECTPTR
- 用来控制是否包含在PRJ_TARGET_EXECUTABLE-
列表中。TEST_TAGS
- 包含项目标签。PRJ_SUFFIX
- 用于构造最终的可执行文件名PRJ_PROJECT_NAME_RESULT_NAME_BASE
。
根据上述规则,PRJ_STORAGE
、PRJ_MEMDEV
、PRJ_TRANSMGR
重写了项目构建参数中的PRJ_PROJECT_NAME_STORAGE
、PRJ_PROJECT_NAME_F_MCOCOMP_FORCE
、PRJ_PROJECT_NAME_STORAGEDEV
、PR J_PROJECT_NAME_MEMDEV
、PRJ_PROJECT_NAME_TRANSMGS
和PRJ_PROJECT_NAME_F_SEQUENCES
。