背景:
有多个项目进行开发,由于个别项目特殊,需要单独修改组件代码(除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自身支持的吗?还是需要单独开发
是支持的。
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()
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 个赞
好的,我先学习试一下