OpenHarmony 2.0 Canary 标准系统的编译流程 原创 精华

liangkz_梁开祝
发布于 2021-9-8 13:33
浏览
6收藏

OpenHarmony 2.0 Canary 标准系统的编译流程

liangkz 2021.09.08

 

标准系统的编译入口是代码根目录下的build.sh,指令是:

./build.sh --product-name Hi3516DV300 --ccache

 

【1】打开build.sh脚本查看

source_root_dir="${script_path}"

while [[ ! -f "${source_root_dir}/.gn" ]]; do

这一小段是在build.sh脚本所在目录下找到.gn文件,将其内容添加到当前的编译环境中。

接下来执行tools_checker.py脚本,检查操作系统以及编译依赖工具是否满足需要。

 

再带参数执行preloader.py脚本:

${PYTHON3} ${source_root_dir}/build/loader/preloader/preloader.py \

  --product-name ${product_name} \

  --source-root-dir ${source_root_dir} \

  --products-config-dir "productdefine/common/products" \

  --preloader-output-root-dir "out/build_configs"

前两个参数分别是产品名字“Hi3516DV300 ”和源代码根目录,第三个参数,是预定义的产品配置表Hi3516DV300.json的存放路径,第四个参数是preloader.py脚本执行的输出目录。

打开preloader.py脚本看一下,描述的是如何根据上面的显式参数,以及各种隐式的环境变量参数等,经过判断和组合,一步步生成out/build_configs/目录下的各个配置文件,这些配置文件将作为后继编译步骤的基础参数被使用。

 

再接下来就是带参数执行build_standard.sh开始正式编译了

${source_root_dir}/build/build_scripts/build_${system_type}.sh \

  --product-name ${product_name} \

  --device-name ${device_name} \

  --target-os ${target_os} \

  --target-cpu ${target_cpu} \

  ${build_params}

build_standard.sh执行完了,要么编译成功,要么编译失败。

 

【2】打开build_standard.sh脚本查看

source ${script_path}/parse_params.sh

system_type="standard"

source ${script_path}/build_common.sh

do_make_ohos

分别是用parse_params.sh分析参数,将build_common.sh引入并执行其中的do_make_ohos()函数。

 

【3】打开build_common.sh查看do_make_ohos()

也只做了一件事,为build_ohos.sh收集一组参数,最后执行build_ohos.sh:

build_ohos_cmd: build/build_scripts/build_ohos.sh product_name=Hi3516DV300 target_os=ohos target_cpu=arm gn_args=is_standard_system=true build_target=images

 

【4】打开build_ohos.sh查看

    source ${BUILD_SCRIPT_DIR}/pre_process.sh

    pre_process "$@"

    source ${BUILD_SCRIPT_DIR}/make_main.sh

    do_make "$@"

    source ${BUILD_SCRIPT_DIR}/post_process.sh

    post_process "$@"

分三步走:

【4.1】引入//build/core/build_scripts/pre_process.sh并执行pre_process(),主要是参数的分析和处理。

【4.2】引入//build/core/build_scripts/make_main.sh并执行do_make(),这里才是真正的编译主体,包括了生成build.log、gn、ninja等具体的编译步骤。

【4.3】引入//build/core/build_scripts/post_process.sh并执行post_process(),这是完成编译后的收尾处理,或者操作“CTRL+C”中断编译的后期处理,包括了计算编译时间,更新pycache/ccache状态,统计并打印编译数据等。

 

【5】打开make_main.sh查看,也可分为三步:

【5.1】生成build.log文件

    # prepare to save build log

    LOG_FILE=${TARGET_OUT_DIR}/build.log

    log_prepare $LOG_FILE

    log "$@"

这里生成out/ohos-arm-release/build.log文件,这个文件第一句话就是log "$@"打印出来的执行参数:

product_name=Hi3516DV300 target_os=ohos target_cpu=arm gn_args=is_standard_system=true build_target=images

在此之前,所有脚本的执行信息,都是echo到终端上显示而已,并不会记录到这个log中。

 

【5.2】接下来引入get_gn_parameters.sh并执行get_gn_parameters()来收集一组参数,并执行gn gen命令:

    source ${BUILD_SCRIPT_DIR}/get_gn_parameters.sh

    get_gn_parameters

 

    if [ "${SKIP_GN_PARSE}"x = falsex ]; then

        ${BUILD_TOOLS_DIR}/gn gen ${TARGET_OUT_DIR} \

            --args="target_os=\"${TARGET_OS}\" target_cpu=\"${TARGET_ARCH}\" is_debug=false \

            product_name=\"${PRODUCT_NAME}\" \

            is_component_build=true \

            ${GN_ARGS} ${TEST_BUILD_PARA_STRING}  ${IS_ASAN} \

            release_test_suite=${RELEASE_TEST_SUITE}" 2>&1 | tee -a $log

    fi

执行gn gen命令,将会按.gn文件的root = "//build/core/gn" 参数,将//build/core/gn/BUILD.gn文件作为编译入口,从此开始进入相关依赖关系的递归查找和执行BUILD.gn,最终在out目录相应的地方生成ninja文件。

//build/core/gn/BUILD.gn 引入load.py并执行它,做了非常多的重要工作,生成//out/ohos-arm-release/build_configs/ 目录下的所有内容,详情请自行跟踪和分析一下。

build_loader_script = rebase_path("//build/loader/load.py")

load_result = exec_script(build_loader_script, arguments, "string")

 

【5.3】接下来收集ninja的编译参数,并运行ninja开始编译,根据编译规则生成中间文件和最终的烧录镜像文件,编译过程也全部记录在log中。

    ninja_build_args="--source-root-dir ${BASE_HOME} --root-build-dir ${TARGET_OUT_DIR} \

            --build-target-name ${BUILD_TARGET_NAME}"

    if [ "${TARGET_PLATFORM}" != "" ];then

        ninja_build_args="$ninja_build_args --target-platform ${TARGET_PLATFORM}"

    fi

    real_build_target=$(python ${BASE_HOME}/build/scripts/build_target_handler.py $ninja_build_args)

${BUILD_TOOLS_DIR}/ninja -d keepdepfile -C ${TARGET_OUT_DIR} ${real_build_target} ${NINJA_ARGS} 2>&1 | tee -a $log

Ninja执行完毕,编译也就完成了,执行【4.3】//build/core/build_scripts/post_process.sh完成编译的后期处理。

 

【附件是经过处理的部分编译的log】

 

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
build_log.rar 1.19K 15次下载
已于2021-9-8 13:36:31修改
11
收藏 6
回复
举报
5条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

前排学习楼主最新文章。

回复
2021-9-8 13:46:27
liangkz_梁开祝
liangkz_梁开祝 回复了 红叶亦知秋
前排学习楼主最新文章。

^_^

回复
2021-9-8 15:05:43
liangkz_梁开祝
liangkz_梁开祝

刚刚发现亮子力老师在6月份已发过一篇,OpenHarmony-2.0-Canary 编译构建流程,分析得更详细,我还收藏了 -_-!! 看来是收藏的帖子太多了给搞忘了。

回复
2021-9-8 15:24:59
Anzia
Anzia

之前做系统开发,就是被shell脚本和ninja编译弄得好累😂

回复
2021-9-9 08:12:58
liangkz_梁开祝
liangkz_梁开祝 回复了 Anzia
之前做系统开发,就是被shell脚本和ninja编译弄得好累😂

没弄懂就会一直累,辛苦一小段时间,尽量弄懂了就不会累了。

回复
2021-9-9 09:15:32
回复
    相关推荐