组件的可裁剪特性可以使用宏隔离、条件打包、条件编译等描述实现,在构建侧需要使用options管理特性,本文指导开发者正确管理可裁剪的特性
组件包如何管理options
conan包使用Options对外呈现特性,openubmc为方便特性管理,使用mds/service.json文件的options向构建工具申明当前组件自定义的特性,每一项配置由description、option、default三部分组成,具体定义与conan特性控制相同,具体细节参考文档 Conan options
下面是一个只支持开和关特性的示例,该示例演示了一个叫enable_firmware的特性,该特性支持True和False两个配置,默认配置为False
"options": {
"enable_firmware": {
"description": "这是一个测试AAPA",
"option": [true, false],
"default": false
}
},构建工具如何使用options
构建工具读取service.json后会使用模板引擎生成conanbase.py,该文件可以被conan理解,其中关键的信息有特性申明、cmake传递、cmake使用
特性申明
模块引擎会将service.json定义的特性转换成python变量。 如下为生成的conanbase.py示例:
options = {
"asan": [True, False],
"gcov": [True, False],
"manufacture": [True, False],
"enable_firmware": [True,False],
}
default_options = {
"asan": False,
"gcov": False,
"manufacture": False,
"enable_firmware": False,
}- 注: asan、gcov、manufacture为开发者测试和装备预先定义的特性,开发者不用申明。
cmake传递
openubmc的组件自定义构建过程普遍使用CMakeLists.txt构建脚本,因此构建工具会向cmake传递特性状态,具体方式是在conanbase.py的_configure_cmake方法中定义cmake变量。
下面的示例为conanbase.py生成的代码,传递给cmake的变量固定以特性名转大写后加上CONAN_DEFS_前缀,如示例所示的CONAN_DEFS_ENABLE_FIRMWARE:
def _configure_cmake(self):
# 其它代码
self._cmake.definitions["CONAN_DEFS_ENABLE_FIRMWARE"] = self.options.enable_firmware
# 其它代码cmake使用
cmake如何使用不在本文讲解,请参考官方指导。
下面是一种使用方式示例,演示了打开CONAN_DEFS_ENABLE_FIRMWARE特性时包含firmware_mgmt目录的构建脚本:
if (CONAN_DEFS_ENABLE_FIRMWARE)
add_subdirectory("firmware_mgmt")
endif()也可以按特性状态定义宏,如示例:
if (CONAN_DEFS_ENABLE_FIRMWARE)
add_definitions("-DFIRMWARE_ENABLE")
endif()或者控制文件打包,如示例:
if (CONAN_DEFS_ENABLE_FIRMWARE)
install(DIRECTORY firmware_mgmt/gen/interface/client/ DESTINATION include/client FILES_MATCHING PATTERN "*.h")
endif()依赖管理
特性使能后可能引入新的依赖,当前service.json还不具备此项管理能力,需要组件owner自定义依赖管理,具体方法是在组件的conanfile.py实现requirements方法,因为conanbase.py提供了requirements基础实现,所以组件开发者一般是继承父方法再重写。
conanfile.py新增依赖示例,该示例演示了如果使能了enable_firmware特性后需要添加huawei_secure_c/1.0.0@openubmc.release/stable依赖:
def requirements(self):
super(ConanBase, self).build()
if self.options.enable_firmware:
self.requires("huawei_secure_c/1.0.0@openubmc.release/stable")