如何管理组件的特性
更新时间:2025/10/15
在Gitcode上查看源码

组件的可裁剪特性可以使用宏隔离、条件打包、条件编译等描述实现,在构建侧需要使用options管理特性,本文指导开发者正确管理可裁剪的特性

组件包如何管理options

conan包使用Options对外呈现特性,openubmc为方便特性管理,使用mds/service.json文件的options向构建工具申明当前组件自定义的特性,每一项配置由descriptionoptiondefault三部分组成,具体定义与conan特性控制相同,具体细节参考文档 Conan options

下面是一个只支持开和关特性的示例,该示例演示了一个叫enable_firmware的特性,该特性支持TrueFalse两个配置,默认配置为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

python
    def _configure_cmake(self):
        # 其它代码
        self._cmake.definitions["CONAN_DEFS_ENABLE_FIRMWARE"] = self.options.enable_firmware
        # 其它代码

cmake使用

cmake如何使用不在本文讲解,请参考官方指导。

下面是一种使用方式示例,演示了打开CONAN_DEFS_ENABLE_FIRMWARE特性时包含firmware_mgmt目录的构建脚本:

CMakeList
if (CONAN_DEFS_ENABLE_FIRMWARE)
add_subdirectory("firmware_mgmt")
endif()

也可以按特性状态定义宏,如示例:

CMakeList
if (CONAN_DEFS_ENABLE_FIRMWARE)
    add_definitions("-DFIRMWARE_ENABLE")
endif()

或者控制文件打包,如示例:

CMakeList
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依赖:

python
    def requirements(self):
        super(ConanBase, self).build()
        if self.options.enable_firmware:
            self.requires("huawei_secure_c/1.0.0@openubmc.release/stable")