OpenHarmony 2.0 Canary 標準系統的編譯流程
標準系統的編譯入口是代碼根目錄下的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】
https://harmonyos.51cto.com/resource/1204