咨询除vpd外的其他组件是否能够定制选择

背景:
有多个项目进行开发,由于个别项目特殊,需要单独修改组件代码(除vpd外其他组件),而这部分与社区主线无关系或不方便合入社区(对功能进行裁减),那么就需要分别维护多个分支。
方案考虑:
除使用单独特性分支进行处理,是否有更通用的方案,参考现有组件代码,rackmount组件存在oem可选择厂商新增功能,或options进行开关功能。但存在以下特殊情况,部分项目修改单一组件涉及多个lua文件修改,是否能通过oem、options还是其他的形式,在组件构建的时候直接进行文件的替换,或类似vpd仓中支持构建不同产品,在manifest.yml进行选择options: board_name: openUBMC

options(选项开关/特性开关)是一个通用的处理方式。 针对lua代码,没有C语言的编译宏,可以使用文件替换的方式,或者通过读取配置文件在代码里判断进行区分不同的option。

在manifest仓库可以增加多个产品或单板,组件配置不同的option,以满足多个项目的述求。

  build 
        product
              BMC
                   openUBMC
                          manifest.yml
                   board_A
                          manifest.yml
                   board_B
                          manifest.yml
1 个赞

那么回复中文件替换的方式是bingo或者bmcgo自身支持的吗?还是需要单独开发

:white_check_mark: 是支持的。

:one: CMakeLists方式
组件定义的option,b ingo会把option构造成编译选项(CONAN_DEFS_+option名全大写)注入到conan中,执行build后可以在组件目录conanbase.py_pre_generate方法中查看。
比如:option名称为example,则对应的编译选项则为CONAN_DEFS_EXAMPLE

在CMakeLists.txt中,根据编译选项判断,打包不同的文件

if (CONAN_DEFS_XXX)
    install(xxxxx)
else()
   install(yyyy)
endif()

:two: conanfile方式
在conanfile.py文件中的类中新增如下代码:

class AppConan(ConanBase):
    # 省略

    def _package(self)
        if self.options.xxx:
            src_file = os.path.join(self.source_folder, "file.lua")
            dst_file  = os.path.join(self.package_folder, "file.lua")
            self.run(f"cp -f {src_file} {dst_file}")
        else:
            # copy b to xxx

    def package(self):
        super(AppConan, self).package()
        self._package()
1 个赞

我认为mainfest.yml也只是展示的给普通开发者的一种形式,提供了便捷性,简化了参数的构建复杂度,提供了清晰的配置方式。对于资深开发者可以考虑深入底层添加patch。

1 个赞

好的,我先学习试一下