bulid

来聊创建自己的 Build System。如果你发觉你总在输入重复的文字内容,那就要用前面的代码补全的功能。如果你发现有一系列操作或者是命令是要很频繁的执行的,例如一个软件写完之后要测试编译执行看报错,那就可以把这些操作写成一个 build,一键完成。

参考 这里 。

chrome 打开 html 文件

名字虽然叫 build 但是执行的任务也不是非得编译软件,任何命令都可以呀,只要能自动化重复性劳动就行呗。

menu->tools->build system-> new build system 这里打开一个文件,粘贴下面内容

{
  "cmd": ["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", "$file"],
  "selector": "text.html"
}

注意,根据 这里 的说明,selector 生效的前提是 menu->tools-> build system->Automatic 设置为 true 。

保存到 User/ 之下,名字叫 browse.sublime-build 。

build 我的 jekyll 页面

再来个稍微复杂点的。还是说我这里的视频笔记,每次写完一些内容之后,我都要执行

git commit -a -m"wip" && git push

把新改的内容做成一个版本然后再推送到 github 上面,这样我再到 github 上对应的页面刷新,就看到效果了。这些步骤不少,看看怎么样做成一个 build 来一键完成。

大体思路是这样,把所有的工作都写成一个 bash 脚本,然后在 build 这里直接执行。

jekyll.sublime-build 中这样写

{
    "cmd": ["/Users/peter/bin/jekyll.sh", "$file"],
    "working_dir": "$file_path",
    "selector": "text.html.markdown"
}

注意 jekyll.sh 中一定要写 shebang 也就是第一行的声明,不然 sublime 中就会报格式错误,另外就是要执行

chmod +x jekyll.sh

关于命令行使用和 shell 脚本编程,可以参考 Linux Guide for Developers 这门课程。

现在,就可以执行 jekyll.sh 了,这个里面写

#!/usr/bin/env bash
git commit -a -m"wip" && git push
# echo  $1
VAR=$1 # full file patch, e.g /Users/peter/rails10-va/happysublime/10_build.md
FILE=`basename $VAR` # get 10_build.md from full path
PAGE=${FILE%.*}".html" # 10_build.md -> 10_build.html

DIR=`dirname $VAR`
PROJECT=`basename $DIR` # get happysublime
# echo $PARENT
URL="happypeter.github.io/"$PROJECT"/"$PAGE
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' $URL

这样每次我修改完视频笔记就可以直接敲 Cmd-b 推送到 github 上,并且在 chrome 中打开看到效果了。不过美中不足的时并不是直接推送到 github 上的内容, jekyll 网站页面上就会立即生效,所以一般要等几秒再刷新一下才能看到效果。

#!/bin/bash # Logging functions with color-coded output function log_error() { local msg="$1" if [[ -n "${msg}" ]]; then echo -e "\033[31m[ERROR] ${msg}\033[0m" fi } function log_info() { local msg="$1" if [[ -n "${msg}" ]]; then echo -e "\033[32m[INFO] ${msg}\033[0m" fi } function log_warn() { local msg="$1" if [[ -n "${msg}" ]]; then echo -e "\033[33m[WARN] ${msg}\033[0m" fi } # Execute command with error checking function run_command() { local cmd="$@" log_warn "Executing: $cmd" time eval "$cmd" local retVal=$? if [ $retVal -ne 0 ]; then log_error "Command failed with exit code $retVal: $cmd" exit $retVal else log_info "Command succeeded: $cmd" fi } # Build Android QSSI function build_android_qssi() { if [ -d "${ANDROID_QSSI_DIR}" ]; then cd "${ANDROID_QSSI_DIR}" || exit 1 unset PATH || true export PATH="${ORIGIN_ENV}" log_info "build android_qssi start" run_command "source build/envsetup.sh" run_command "lunch ${ANDROID_QSSI_TARGET}-${AND_BUILD_VARIANT}" run_command "${BASH} build.sh dist -j${MAX_JOBS} --qssi_only" log_info "build android_qssi end" else log_warn "${ANDROID_QSSI_DIR} not found, skipping!" fi } # Build Android Vendor function build_android_vendor() { if [ -d "${ANDROID_VENDOR_DIR}" ]; then cd "${ANDROID_VENDOR_DIR}" || exit 1 unset PATH || true export PATH="${ORIGIN_ENV}" log_info "build android_vendor start" run_command "source build/envsetup.sh" run_command "lunch ${ANDROID_VENDOR_TARGET}-${AND_BUILD_VARIANT}" run_command "source kernel_platform/qcom/proprietary/prebuilt_HY11/vendorsetup.sh" run_command "bash kernel_platform/build/android/prepare_vendor.sh autogvm gki" run_command "${BASH} build.sh dist -j${MAX_JOBS} --target_only" # Generate super.img if [ ! -e "${ANDROID_QSSI_DIR}/out/target/product/${ANDROID_QSSI_TARGET}/system.img" ]; then log_error "system.img must exist when generating super.img" exit 1 fi run_command "${PYTHON} vendor/qcom/opensource/core-utils/build/build_image_standalone.py --image super \ --qssi_build_path ${ANDROID_QSSI_DIR} \ --target_build_path ${ANDROID_VENDOR_DIR} \ --merged_build_path ${ANDROID_VENDOR_DIR} \ --target_lunch ${ANDROID_VENDOR_TARGET} --output_ota --skip_qiifa" log_info "build android_vendor end" else log_warn "${ANDROID_VENDOR_DIR} not found, skipping!" fi } # Build Android OTA package function build_android_ota() { if [ -d "${ANDROID_VENDOR_DIR}" ]; then cd "${ANDROID_VENDOR_DIR}" || exit 1 unset PATH || true export PATH="${ORIGIN_ENV}" log_info "build android_ota start" run_command "source build/envsetup.sh" run_command "lunch ${ANDROID_VENDOR_TARGET}-${AND_BUILD_VARIANT}" run_command "${BASH} build.sh dist --merge_only" log_info "build android_ota end" else log_error "${ANDROID_VENDOR_DIR} not found, exiting!" exit 1 fi } # Build QCOM components function build_qcom_boot() { log_info "build qcom_boot start" cd "${TEST_DEVICE_DIR}/boot" || exit 1 run_command "${PYTHON} boot_images/boot_tools/buildex.py --variant AU -r RELEASE -t Makena,QcomToolsPkg" log_info "build qcom_boot end" } function build_qcom_tz() { log_info "build qcom_tz start" cd "${TEST_DEVICE_DIR}/tz/trustzone_images/build/ms/" || exit 1 run_command "python3 build_all.py -b TZ.XF.5.0 CHIPSET=makena" log_info "build qcom_tz end" } function build_qcom_sdsp() { log_info "build qcom_sdsp start" cd "${TEST_DEVICE_DIR}/sdsp/slpi_proc/build/ms/" || exit 1 run_command "${PYTHON} ./build_variant.py makena.slpi.prod2" log_info "build qcom_sdsp end" } function build_qcom_cdsp() { log_info "build qcom_cdsp start" cd "${TEST_DEVICE_DIR}/cdsp/cdsp_proc/build/ms/" || exit 1 run_command "${PYTHON} ./build_variant.py makena.cdsp0.prod" run_command "${PYTHON} ./build_variant.py makena.cdsp1.prod" log_info "build qcom_cdsp end" } function build_qcom_adsp() { log_info "build qcom_adsp start" cd "${TEST_DEVICE_DIR}/adsp/adsp_proc/build/ms/" || exit 1 run_command "${PYTHON} ./build_variant.py makena.adsp_au.prod2" log_info "build qcom_adsp end" } function build_qcom_aop() { log_info "build qcom_aop start" cd "${TEST_DEVICE_DIR}/aop/aop_proc/build/" || exit 1 run_command "${BASH} build_makenaau.sh" log_info "build qcom_aop end" } function build_qcom_bin() { log_info "build qcom_bin start" if [ ! -d "${TEST_DEVICE_DIR}" ]; then log_error "${TEST_DEVICE_DIR} not found, exiting!" exit 1 fi cd "${TEST_DEVICE_DIR}" || exit 1 run_command "source setenv.sh" build_qcom_aop build_qcom_adsp build_qcom_cdsp build_qcom_sdsp build_qcom_boot build_qcom_tz log_info "build qcom_bin end" } # Build Android (QSSI + Vendor) function build_android_all() { log_info "build android_all start" build_android_qssi build_android_vendor log_info "build android_all end" } # Build QNX function build_qnx_only() { log_info "build qnx_only start" if [ -d "${QNX_DIR}" ]; then unset PATH || true export PATH="${ORIGIN_ENV}" cd "${QNX_DIR}/workspace/modules/bsp/apps/qnx_ap" || exit 1 run_command "source setenv_hyp710.sh --external $(pwd)/../../../../../external/sdk/qualcomm/qnx710_host -p 3R425" run_command "make" else log_warn "no qnx code found, skipping!" fi log_info "build qnx_only end" } # Build meta function build_meta() { log_info "build meta start" cd "${TEST_DEVICE_DIR}" || exit 1 if [ ! -d "${ANDROID_QSSI_DIR}" ]; then log_error "${ANDROID_QSSI_DIR} not found, exiting!" exit 1 fi if [ ! -d "${ANDROID_VENDOR_DIR}" ]; then log_error "${ANDROID_VENDOR_DIR} not found, exiting!" exit 1 fi if [ ! -d "${TEST_DEVICE_DIR}/apps_kernel" ]; then mkdir "${TEST_DEVICE_DIR}/apps_kernel" || exit 1 fi ln -fs "$(dirname "$(dirname "${ANDROID_QSSI_DIR}")")" . ln -fs "$(dirname "$(dirname "${ANDROID_VENDOR_DIR}")")" . ln -fs "${QNX_DIR}/workspace/modules/bsp/apps" . ln -fs "${KERNEL_PLATFORM_DIR}" "${TEST_DEVICE_DIR}/apps_kernel" cd "${TEST_DEVICE_DIR}/common/build" || exit 1 if [ "${GWM_V4_DV}" == "true" ]; then sed -i 's/<file_name>cluster.img<\/file_name>/<file_name><\/file_name>/g' "${TEST_DEVICE_DIR}/common/config/contents_${VARIANT}.xml" sed -i 's/<file_name>qnxres.img<\/file_name>/<file_name><\/file_name>/g' "${TEST_DEVICE_DIR}/common/config/contents_${VARIANT}.xml" sed -i 's/<file_name>vr.img<\/file_name>/<file_name><\/file_name>/g' "${TEST_DEVICE_DIR}/common/config/contents_${VARIANT}.xml" sed -i 's/<file_name>navi_buffer.img<\/file_name>/<file_name><\/file_name>/g' "${TEST_DEVICE_DIR}/common/config/contents_${VARIANT}.xml" sed -i 's/<file_name>appres.img<\/file_name>/<file_name><\/file_name>/g' "${TEST_DEVICE_DIR}/common/config/contents_${VARIANT}.xml" sed -i 's/filename=\"qnxres.img\"/filename=\"\"/g' "${TEST_DEVICE_DIR}/common/config/ufs/partition_la_ext.xml" sed -i 's/filename=\"cluster.img\"/filename=\"\"/g' "${TEST_DEVICE_DIR}/common/config/ufs/partition_la_ext.xml" sed -i 's/filename=\"navi_buffer.img\"/filename=\"\"/g' "${TEST_DEVICE_DIR}/common/config/ufs/partition_la_ext.xml" sed -i 's/filename=\"vr.img\"/filename=\"\"/g' "${TEST_DEVICE_DIR}/common/config/ufs/partition_la_ext.xml" sed -i 's/filename=\"appres.img\"/filename=\"\"/g' "${TEST_DEVICE_DIR}/common/config/ufs/partition_la_ext.xml" fi run_command "${PYTHON} build.py --flavors=${FLAVOR} --variant=${VARIANT} --st=${STORAGE}" log_info "build meta end" } # Pack qfile function pack_qfile() { log_info "build pack_qfile start" cd "${SCRIPTS_DIR}" || exit 1 run_command "${PYTHON} copy_meta_data.py --rootdir ${TOP_CODE_DIR} --output ${TOP_CODE_DIR} --variant ${VARIANT} --flavor ${FLAVOR} --storage ${STORAGE}" log_info "please get the flash img in ${TOP_CODE_DIR}/output" log_info "build pack_qfile end" } # Build userdebug (full build including QCOM, QNX, meta, and OTA) function build_userdebug() { log_info "build userdebug start" AND_BUILD_VARIANT="userdebug" build_android_all build_qnx_only build_qcom_bin build_meta build_android_ota log_info "build userdebug end" } # Build user (release version) function build_user() { log_info "build user start" unset AND_BUILD_VARIANT || true export AND_BUILD_VARIANT="user" build_android_all build_qnx_only build_qcom_bin build_meta build_android_ota log_info "build user end" } # Print help message function print_help() { log_warn "Android and QNX project paths must be replaced with actual project info!" log_info "build android qssi:\nbash build_all.sh --android_qssi" log_info "build android vendor:\nbash build_all.sh --android_vendor" log_info "build android all:\nbash build_all.sh --android_all" log_info "build qnx:\nbash build_all.sh --qnx_only" log_info "build android+qnx:\nbash build_all.sh --android_qnx" log_info "build qcom bin:\nbash build_all.sh --qcom_bin" log_info "build android ota:\nbash build_all.sh --ota\nWarning: run this after compiling all code once" log_info "build userdebug version:\nbash build_all.sh --userdebug" log_info "build user release version:\nbash build_all.sh --user" log_info "pack qfile img:\nbash build_all.sh --pack_qfile" } # Main function function main() { if [ $# -eq 0 ]; then print_help exit 0 fi # Parse arguments ARGS=$(getopt -o h --long help,pack_qfile,android_all,qcom_bin,ota,userdebug,user,android_qssi,android_vendor,qnx_only,android_qnx,dv,recompile_kernel,android_vendor_pro:,qnx_pro:,variant:,storage:,flavor:,jobs: -n "$0" -- "$@") if [ $? -ne 0 ]; then log_error "Invalid arguments. Terminating..." exit 1 fi eval set -- "${ARGS}" # Initialize flags declare -A BUILD_FLAGS while true; do case "$1" in -h|--help) print_help exit 0 ;; --android_all) BUILD_FLAGS[ANDROID_ALL]=1; shift ;; --android_qssi) BUILD_FLAGS[ANDROID_QSSI]=1; shift ;; --android_vendor) BUILD_FLAGS[ANDROID_VENDOR]=1; shift ;; --qcom_bin) BUILD_FLAGS[QCOM_BIN]=1; shift ;; --ota) BUILD_FLAGS[ANDROID_OTA]=1; shift ;; --qnx_only) BUILD_FLAGS[QNX]=1; shift ;; --recompile_kernel) export RECOMPILE_KERNEL=1; shift ;; --android_qnx) BUILD_FLAGS[ANDROID_QNX]=1; shift ;; --userdebug) BUILD_FLAGS[USERDEBUG]=1; shift ;; --user) BUILD_FLAGS[USER]=1; shift ;; --pack_qfile) BUILD_FLAGS[PACK_QFILE]=1; shift ;; --dv) export GWM_V4_DV=true; shift ;; --android_vendor_pro) ANDROID_VENDOR_TARGET="$2"; shift 2 ;; --qnx_pro) QNX_TARGET="$2"; shift 2 ;; --variant) VARIANT="$2"; shift 2 ;; --storage) STORAGE="$2"; shift 2 ;; --flavor) FLAVOR="$2"; shift 2 ;; --jobs) MAX_JOBS="$2"; shift 2 ;; --) shift; break ;; *) log_error "Unknown option: $1"; exit 1 ;; esac done # Global settings TOP_CODE_DIR=$(dirname "$(pwd)") QFILE_DIR="${TOP_CODE_DIR}/pack/qfile" FASTBOOT_DIR="${TOP_CODE_DIR}/pack/fastboot" ANDROID_QSSI_DIR="${TOP_CODE_DIR}/lagvm_qssi/LINUX/android" ANDROID_VENDOR_DIR="${TOP_CODE_DIR}/lagvm/LINUX/android" KERNEL_PLATFORM_DIR="${TOP_CODE_DIR}/lagvm_qssi/LINUX/android/kernel_platform" QNX_DIR="${TOP_CODE_DIR}/qnx" TEST_DEVICE_DIR="${TOP_CODE_DIR}/test_device" SCRIPTS_DIR="${TOP_CODE_DIR}/integration" ORIGIN_ENV="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ANDROID_QSSI_TARGET=${ANDROID_QSSI_TARGET:-'qssi_au'} ANDROID_VENDOR_TARGET=${ANDROID_VENDOR_TARGET:-'msmnile_gvmq'} MAX_JOBS=${MAX_JOBS:-24} RECOMPILE_KERNEL=${RECOMPILE_KERNEL:-0} VARIANT=${VARIANT:-'8888la'} STORAGE=${STORAGE:-'ufs'} FLAVOR=${FLAVOR:-'8888_la'} PYTHON=${PYTHON:-'python'} BASH=${BASH:-'/bin/bash'} AND_BUILD_VARIANT=${AND_BUILD_VARIANT:-'userdebug'} # Execute builds based on flags if [ "${BUILD_FLAGS[USERDEBUG]}" == 1 ]; then build_userdebug elif [ "${BUILD_FLAGS[USER]}" == 1 ]; then build_user else if [ "${BUILD_FLAGS[ANDROID_ALL]}" == 1 ]; then build_android_all fi if [ "${BUILD_FLAGS[ANDROID_QSSI]}" == 1 ]; then build_android_qssi fi if [ "${BUILD_FLAGS[ANDROID_VENDOR]}" == 1 ]; then build_android_vendor fi if [ "${BUILD_FLAGS[ANDROID_OTA]}" == 1 ]; then build_android_ota fi if [ "${BUILD_FLAGS[QNX]}" == 1 ]; then build_qnx_only fi if [ "${BUILD_FLAGS[ANDROID_QNX]}" == 1 ]; then build_android_all build_qnx_only fi if [ "${BUILD_FLAGS[QCOM_BIN]}" == 1 ]; then build_qcom_bin fi if [ "${BUILD_FLAGS[PACK_QFILE]}" == 1 ]; then build_meta pack_qfile fi fi } # Run main main "$@" 请优化此代码实现,执行bash build_all.sh --userdebug或bash build_all.sh --user可以编译,且函数build_qcom_bin和build_meta也可以执行,且满足代码规范
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值