构建工具管理
更新时间: 2025/12/09
在Gitcode上查看源码

本文用于指导开发者管理组件特有的构建工具。

目前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示例。

python
# 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方法管理构建依赖,我们只需要将需要的工具添加到依赖清单即可。

python
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环境变量。