📚往期学习笔录📝:
编译模块整体描述
- 目的:使用这个模块里的脚本、配置来编译整个开源鸿蒙系统,生成一个操作系统可执行文件
- build模块源码地址:https://gitee.com/openharmony/build
- 基于Gn和ninja的编译构建框架(类似于CMake/QMake/Automake + Makefile)
- 使用Python文件、Python插件或者bash脚本安装依赖工具、按要求生成BUILD.gn配置文件
- build模块介绍 - 编译构建
- 编译的方法有三种:
- 1:运行Python源码,生成BUILD.gn并编译
- 2:运行使用Python写的插件hb,生成BUILD.gn并编译
- 3:运行bash脚本,生成BUILD.gn并编译
第一种编译,使用Python源码:
- python3 build.py -p qemu_mini_system_demo@ohemu 这是编译命令
- Docker编译环境
- build.py文件在OpenHarmony源码文件夹的顶层,但其实顶层的文件只是一个链接:build.py -> build/build_scripts/build.py
- 这是build.py文件的内容:
import os
import sys
import importlib
import subprocess
def search(findir: str, target: str) -> str or bool:
for root, _, files in os.walk(findir):
if target in files:
return root
return False
def find_top() -> str:
cur_dir = os.getcwd()
while cur_dir != "/":
build_config_file = os.path.join(
cur_dir, 'build/config/BUILDCONFIG.gn')
if os.path.exists(build_config_file):
return cur_dir
cur_dir = os.path.dirname(cur_dir)
def get_python(python_relative_dir: str) -> str:
topdir = find_top()
if python_relative_dir is None:
python_relative_dir = 'prebuilts/python'
python_base_dir = os.path.join(topdir, python_relative_dir)
if os.path.exists(python_base_dir):
python_dir = search(python_base_dir, 'python3')
return os.path.join(python_dir, 'python3')
else:
print("please execute build/prebuilts_download.sh.",
"if you used '--python-dir', check whether the input path is valid.")
sys.exit()
def check_output(cmd: str, **kwargs) -> str:
process = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True,
**kwargs)
for line in iter(process.stdout.readline, ''):
sys.stdout.write(line)
sys.stdout.flush()
process.wait()
ret_code = process.returncode
return ret_code
def build(path: str, args_list: list) -> str:
python_dir = None
if "--python-dir" in args_list:
index = args_list.index("--python-dir")
if index < len(args_list) - 1:
python_dir = args_list[index + 1]
del args_list[index: index + 2]
else:
print("-python-dir parmeter missing value.")
sys.exit()
python_executable = get_python(python_dir)
cmd = [python_executable, 'build/hb/main.py', 'build'] + args_list
return check_output(cmd, cwd=path)
def main():
root_path = find_top()
return build(root_path, sys.argv[1:])
if __name__ == "__main__":
sys.exit(main())
第二种编译,运行Python插件:
- HB构建工具使用指导
- 使用Python的插件ohos-build,使用命令为 hb set; hb build -f 安装流程为
- python3 -m pip install --user ohos-build==0.4.3 或者
- python3 -m pip install --user build/hb
- hb源码在OpenHarmony源码的./build/hb文件夹下:
import os
from setuptools import setup
from resources.global_var import VERSION
LONG_DESCRIPTION = ""
WORK_PATH = os.path.abspath(os.path.dirname('__file__'))
README_PATH = os.path.join(WORK_PATH, 'README.md')
with open(README_PATH, 'r', encoding='utf-8') as FILE_DESCRIPTION:
LONG_DESCRIPTION = FILE_DESCRIPTION.read()
setup(
name='ohos-build',
version=VERSION,
author='Huawei