本文用于指导开发者管理组件特有的构建工具。
目前openubmc有特殊构建工具的组件主要是ai_engine(依赖flatbuffers)
说明
部分组件构建时需要使用特殊的构建工具,这些工具可能不在构建OS中并且一般针对专用场景,考虑到工具管理方式归一、持续演进(适配编译器、OS、芯片等),所有特有的构建工具请使用conan管理,原则上产品构工程和manifest仓将不再为特定app添加构建依赖。
基本逻辑
首先我们需要将工具conan化,在依赖工具的组件conanfile.py中添加build_requirements方法引入构建时的工具依赖。
ai_engine组件改造示例:
STEP1: flatbuffers构建工具conan化
创建工具的conan包,这一步需要在conan_index仓中添加flatbuffers构建脚本,
工具一般需要对外呈现一个或一组命令,因此工具conan包最显著的特征是要在package_info方法中管理好自己的PATH环境变量,当构建依赖此工具的组件时(如ai_engine组件构建时)该变量会注入PATH环境变量以正确查找到需要的工具。
除此之外,工具包跟开源软件、平台软件等conan包没有区别,就是添加一个普通的conan组件,flatbuffers完整的conanfile.py示例。
# Copyright © Huawei Technologies Co., Ltd. 2022-2025. All rights reserved.
from conans import ConanFile, tools, CMake
from conans.errors import ConanInvalidConfiguration
import os
required_conan_version = ">=1.42.0"
class FlatbuffersConan(ConanFile):
generators = "cmake"
homepage = "https://google.github.io/flatbuffers/"
description = "FlatBuffers is an efficient cross platform serialization library. "
chost = None
settings = "os", "compiler", "build_type", "arch"
exports_sources=["permissions.ini"]
_cmake = None
@property
def _source_subfolder(self):
return "source_subfolder"
def validate(self):
if self.settings.arch != "x86_64":
raise ConanInvalidConfiguration("Only x86_64 supported")
def source(self):
git = tools.Git(verify_ssl=False)
git.clone(**self.conan_data["sources"][self.version])
def _configure_cmake(self):
if self._cmake:
return self._cmake
self._cmake = CMake(self)
os.environ['CFLAGS'] = os.getenv('CFLAGS') + " -D_FORTIFY_SOURCE=2"
os.environ['CXXFLAGS'] = os.getenv('CXXFLAGS') + " -D_FORTIFY_SOURCE=2"
if self.settings.arch == "armv8" or self.settings.arch == "x86_64":
self._cmake.definitions["CMAKE_INSTALL_LIBDIR"] = "usr/lib64"
else:
self._cmake.definitions["CMAKE_INSTALL_LIBDIR"] = "usr/lib"
self._cmake.definitions["CMAKE_INSTALL_BINDIR"] = "usr/bin"
self._cmake.configure(args=["--no-warn-unused-cli"])
return self._cmake
def build(self):
cmake = self._configure_cmake()
cmake.build()
cmake.install()
def package_info(self):
self.env_info.PATH.append(os.path.join(self.package_folder, "usr", "bin"))NOTE
上述示例最重要的是package_info方法将打包目录追加到PATH环境变量。
STEP2:构建工具包
可以用bmcgo build -t dependencies -cp flatbuffers/2.0.0 --verbose命令构建出可用的版本。
正式发布需要使用CI工程
STEP3:引入工具
conan提供了build_requirements方法管理构建依赖,我们只需要将需要的工具添加到依赖清单即可。
import subprocess
class AppConan(ConanBase):
def build_requirements(self):
super(ConanBase, self).build()
# 由build_requires引入工具依赖
self.build_requires("flatbuffers/2.0.0@openubmc.dev/dev")
# 启动构建示例
def build(self):
# .... other 代码
# 调用flatc,此时会去flatbuffers设置的PATH环境变量中查找flatc可执行程序
subprocess.run(f"flatc -o {cml_save_path} -b {self.fbs_path}/CML.fbs {json_path}", shell=True)STEP4:构建
随后只需要构建出包(如ai_engine)即可,构建工具会自动下载,conan会自动设置工具带入的PATH环境变量。